如何添加外键(MySQL的)(How to add Foreign Key (MySQL))

2019-07-21 09:09发布

我非常新的SQL,我试图执行一个简单的ALTER TABLE来创建一个新的列,并把它作为一个外键引用在我的数据库另一个简单的表。 我已经改变了这两个表是InnoDB的

但是,执行ALTER TABLE代码时,我得到以下错误:

Error   1452    Cannot add or update a child row: 
a foreign key constraint fails (`toys`.<result 2 when 
explaining filename '#sql-6d4_6'>, CONSTRAINT 
`#sql-6d4_6_ibfk_1` FOREIGN KEY (`toy_id`) REFERENCES `toys` (`toy_id`))    

下面是这两个表的DESC:

表格1:

FIELD       TYPE     NULL   KEY     EXTRA
toy_id      int(11)  NO     PRI     auto_increment
toy varchar(50) YES         

表2:

FIELD       TYPE        NULL   KEY     EXTRA
boy_id      int(11)     NO     PRI      auto_increment
boy         varchar(50) YES 

这是ALTER查询我试图执行:

    ALTER TABLE boys
    ADD COLUMN toy_id INT NOT NULL,
    ADD CONSTRAINT toys_toy_id_fk
    FOREIGN KEY(toy_id)
    REFERENCES toys(toy_id);

我看了遍试图弄明白,但没有运气。 在此先感谢,并请善待这个新手:)

编辑:

下面是SHOW CREATE TABLE两个表:

表格1:

    CREATE TABLE `toys` (
      `toy_id` int(11) NOT NULL AUTO_INCREMENT,
      `toy` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`toy_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

表2:

    CREATE TABLE `boys` (
      `boy_id` int(11) NOT NULL AUTO_INCREMENT,
      `boy` varchar(50) DEFAULT NULL,
      PRIMARY KEY (`boy_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

Answer 1:

你不能NOT NULL列添加到具有大于零行的表,当列约束相匹配,那些在父表,但只有NULL值,因为它没有DEFAULT一个新的,空白的列值。

解决方法是做到这一点的阶段:添加列,但不要把它声明NOT NULL,不申报的外键呢。

ALTER TABLE boys
 ADD COLUMN toy_id INT;

然后用匹配你的玩具表中的一些值(S)的有效数据填充它。

UPDATE boys SET toy_id = ...;

然后改变列是NOT NULL,并建立约束:

ALTER TABLE boys MODIFY COLUMN toy_id INT NOT NULL,
 ADD CONSTRAINT toys_toy_id_fk
 FOREIGN KEY(toy_id)
 REFERENCES toys(toy_id);


文章来源: How to add Foreign Key (MySQL)