Подтвердить что ты не робот

Как добавить внешний ключ (MySQL)

Я чрезвычайно новичок в 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);

Я искал все, пытаясь понять это, но не повезло. Спасибо заранее, и, пожалуйста, будьте любезны с этим новичком:)

EDIT:

Ниже приведены таблицы 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
4b9b3361

Ответ 1

Вы не можете добавить столбец NOT NULL в таблицу с более чем нулевыми строками, когда столбец ограничен значениями, соответствующими значениям в родительской таблице, и все же имеет только значения NULL, поскольку это новый, непосещенный столбец без DEFAULT.

Обходной путь заключается в том, чтобы сделать это поэтапно: добавьте столбец, но не объявляйте его NOT NULL и еще не объявляйте внешний ключ.

ALTER TABLE boys
 ADD COLUMN toy_id INT;

Затем залейте его действительными данными, которые соответствуют некоторым значениям в таблице ваших игрушек.

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);