【问题标题】:Error when creating foreign key: MySQL Error 1215: Cannot add foreign key constraint [duplicate]创建外键时出错:MySQL 错误 1215:无法添加外键约束 [重复]
【发布时间】:2019-01-31 20:39:12
【问题描述】:

我目前正在为一家公司编写一个预订系统,他们也想要一个任务管理系统,但我遇到了一个让我发疯的错误。

Executing SQL script in server
ERROR: Error 1215: Cannot add foreign key constraint
SQL Code:
        -- -----------------------------------------------------
        -- Table `bvsv_system`.`task`
        -- -----------------------------------------------------
        CREATE TABLE IF NOT EXISTS `bvsv_system`.`task` (
          `idtask` INT(11) NOT NULL,
          `attGora` VARCHAR(200) NULL,
          `status` VARCHAR(45) NULL,
          `to` VARCHAR(45) NULL,
          `jobstatus_id` INT(11) NOT NULL,
          `worker_personnummer` VARCHAR(45) NOT NULL,
          PRIMARY KEY (`idtask`, `jobstatus_id`, `worker_personnummer`),
          INDEX `fk_task_jobstatus1_idx` (`jobstatus_id` ASC),
          INDEX `fk_task_worker1_idx` (`worker_personnummer` ASC),
          CONSTRAINT `fk_task_jobstatus1`
            FOREIGN KEY (`jobstatus_id`)
            REFERENCES `bvsv_system`.`jobstatus` (`id`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION,
          CONSTRAINT `fk_task_worker1`
            FOREIGN KEY (`worker_personnummer`)
            REFERENCES `bvsv_system`.`worker` (`personnummer`)
            ON DELETE NO ACTION
            ON UPDATE NO ACTION)
        ENGINE = InnoDB

SQL script execution finished: statements: 15 succeeded, 1 failed

当我尝试添加链接这两个表的外键时出现此错误

CREATE TABLE IF NOT EXISTS `bvsv_system`.`worker` (
  `personnummer` VARCHAR(45) NOT NULL,
  `fornamn` VARCHAR(45) NULL DEFAULT NULL,
  `efternamn` VARCHAR(45) NULL DEFAULT NULL,
  `extraanstalld` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`personnummer`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = latin1;

CREATE TABLE IF NOT EXISTS `bvsv_system`.`task` (
  `idtask` INT(11) NOT NULL,
  `attGora` VARCHAR(200) NULL,
  `status` VARCHAR(45) NULL,
  `to` VARCHAR(45) NULL,
  `jobstatus_id` INT(11) NOT NULL,
  `worker_personnummer` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idtask`, `jobstatus_id`, `worker_personnummer`),
  INDEX `fk_task_jobstatus1_idx` (`jobstatus_id` ASC),
  INDEX `fk_task_worker1_idx` (`worker_personnummer` ASC),
  CONSTRAINT `fk_task_jobstatus1`
    FOREIGN KEY (`jobstatus_id`)
    REFERENCES `bvsv_system`.`jobstatus` (`id`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_task_worker1`
    FOREIGN KEY (`worker_personnummer`)
    REFERENCES `bvsv_system`.`worker` (`personnummer`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

非常感谢我的程序员伙伴们的帮助! :)

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    外键和主键需要有完全相同的定义。 worker 表定义了DEFAULT CHARACTER SET = latin1

    我不确定您为什么要为不同的表设置不同的字符集。我建议只使用数据库默认值。

    如果您确实需要它们,则使字符集兼容。您可以在列级别执行此操作:

    CREATE TABLE IF NOT EXISTS `task` (
      `idtask` INT(11) NOT NULL,
      `attGora` VARCHAR(200) NULL,
      `status` VARCHAR(45) NULL,
      `to` VARCHAR(45) NULL,
      `jobstatus_id` INT(11) NOT NULL,
      `worker_personnummer` VARCHAR(45) CHARACTER SET latin1 NOT NULL,
      PRIMARY KEY (`idtask`, `jobstatus_id`, `worker_personnummer`),
      INDEX `fk_task_jobstatus1_idx` (`jobstatus_id` ASC),
      INDEX `fk_task_worker1_idx` (`worker_personnummer` ASC),
      CONSTRAINT `fk_task_worker1`
        FOREIGN KEY (`worker_personnummer`)
        REFERENCES `worker` (`personnummer`)
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    )
    ENGINE = InnoDB
    

    【讨论】:

      猜你喜欢
      • 2013-06-02
      • 2018-04-28
      • 2013-07-06
      相关资源
      最近更新 更多