hy000 - mysql设置外键




MySQL错误1215:无法添加外键约束 (18)

Wooo我刚刚得到它! 这是很多已经发布的答案(innoDB,unsigned等)的组合。 我没有在这里看到的一件事是:如果你的FK指向一个PK,确保源列有一个合理的值。 例如,如果PK是一个mediumint(8),请确保源列也包含mediumint(8)。 这是我的一部分问题。

我正在尝试将我的新模式转发到我的数据库服务器上,但我无法弄清楚为什么出现此错误。 我试着在这里搜索答案,但我发现的一切都表示要么将数据库引擎设置为Innodb,要么确保我试图用作外键的键是他们自己的表中的主键。 如果我没有弄错,我已经完成了这两件事。 任何其他帮助你们可以提供?

Executing SQL script in server

ERROR: Error 1215: Cannot add foreign key constraint

-- -----------------------------------------------------
-- Table `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL脚本执行完成:语句:7次成功,1次失败

这是父表的SQL。

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

也要注意反引号的使用。 我在剧本中有以下声明

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

但最后的反引号是错误的。 它应该是:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

MySQL给这个错误不详细的信息...


另一个原因:如果您使用ON DELETE SET NULL ,那么在外键中使用的所有列都必须允许空值。 其他人在这个问题中发现了这一点 。

从我的理解来看,它不会成为数据完整性的问题,但似乎MySQL并不支持这个特性(5.7版本)。


在使用Laravel 4时,特别是在JeffreyWay的Laravel 4 Generators中,遇到了一个“Error 1215:无法添加外键约束”的错误。

在Laravel 4中,您可以使用JeffreyWay的Generators生成迁移文件以逐个创建表,这意味着每个迁移文件都会生成一个表。 您必须意识到,每个迁移文件都是在文件名中使用时间戳生成的,这会为文件提供订单。 生成顺序也是在您启动Artisan CLI命令“php artisan migrate”时迁移操作的顺序。 因此,如果一个文件要求提供一个外键约束,而这个外键约束将引用一个将在后一个文件中生成但尚未生成的键,则会触发Error 1215。 在这种情况下,您需要做的是调整迁移文件生成的顺序。 以适当的顺序生成新文件,复制内容,然后删除无序的旧文件。


对于MySQL(INNODB)...获取要链接的列的定义

SELECT * FROM information_schema.columns WHERE 
TABLE_NAME IN (tb_name','referenced_table_name') AND 
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

比较和验证两个列的定义

相同的COLUMN_TYPE(长度),相同的COLATION

可以帮助玩玩

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

对于其他同样的错误可能并不总是由于列类型不匹配,您可以通过发出命令来了解有关mysql foriegn密钥错误的更多信息

SHOW ENGINE INNODB STATUS;

您可能会在打印的信息顶部附近发现类似的错误

无法在引用表中找到引用列作为第一列显示的索引,或者表中的列类型和引用的表格与约束不匹配。


尝试添加fk时出现同样的错误。 在我的情况下,问题是由FK表的PK标记为无符号引起的。


当列的类型不相同时也会发生这种情况。

例如,如果你所指的列是UNSIGNED INT,而被引用的列是INT,那么你会得到这个错误。


当这个错误发生时,因为被引用的表使用MyISAM引擎,这个答案提供了一个快速的方法来转换你的数据库,所以所有的Django模型表都使用InnoDB: https://.com/a/15389961/2950621 : https://.com/a/15389961/2950621

这是一个名为convert_to_innodb的Django管理命令。


您可能会收到外键约束错误的原因:

  1. 你并没有将InnoDB作为所有表的引擎。
  2. 您正试图在目标表上引用一个不存在的键。 确保它是另一张桌子上的钥匙 (它可以是主钥匙或唯一钥匙)
  3. 列的类型不相同(例外是引用表上的列可以为空)。
  4. 如果PK / FK是一个varchar,请确保两者的排序规则相同。

更新:

  1. 其中一个原因可能是您用于ON DELETE SET NULL的列未定义为空。 所以请确保列设置为默认空值。

检查这些。


我找不到这个错误

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

我曾经有过同样的错误。 我只是简单地重新启动了MySQL服务器并解决了问题。


我有同样的问题,我的解决方案:

之前:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

解:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

我希望这是帮助;)


我猜Clients.Case_Number和/或Staff.Emp_IDClients_has_Staff.Clients_Case_NumberClients_has_Staff.Staff_Emp_ID数据类型不完全相同。

也许父表中的列是INT UNSIGNED

他们需要在两个表中完全相同的数据类型。


检查表格兼容性。 例如,如果一个表是MyISAM ,另一个表是InnoDB ,则可能有此问题。


检查表的排序规则,使用SHOW TABLE STATUS可以检查有关表的信息,包括排序规则。

两个表都必须具有相同的排序规则。

这发生在我身上。


这是已经说过的微妙版本,但在我的例子中,我有2个数据库(foo和bar)。 我首先创建了foo,但我没有意识到它在bar.baz中引用了一个外键(尚未创建)。 当我尝试创建bar.baz(没有任何外键)时,我不断收到此错误。 在环顾四周后,我在foo中找到了外键。

所以,长话短说,如果你得到这个错误,你可能有一个预先存在的外键被创建的表。


错误1215是一个令人讨厌的错误。 爆炸药的答案涵盖了基本知识。 你想确保从那里开始。 但是,还有更多更细微的案例需要注意:

例如,当您试图链接不同表的PRIMARY KEY时,请确保提供适当的ON UPDATEON DELETE选项。 例如:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

不会飞,因为PRIMARY KEY(如id )不能为NULL

我相信,在添加这些类型的约束时,还有更多类似的细微问题,这就是为什么当遇到约束错误时,总是要确保约束及其含义在当前上下文中有意义。 祝你的错误1215!





foreign-keys