Почему мой оператор вставки терпит неудачу?

Я пытаюсь добавить в свою таблицу базы данных, но, похоже, получаю ошибку. Я получаю 1452 ошибку. Вот что я думаю, это проблема: я думаю, что мой parent_fk ссылается на идентификатор, который еще не существует. По крайней мере, я так понимаю следующую ошибку:

Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (assetgallery.ag_asset, CONSTRAINT fk_ag_asset_2 FOREIGN KEY (parent_fk) REFERENCES ag_asset (id) ON DELETE CASCADE ON UPDATE CASCADE)

Скажем, у меня в базе данных есть кортеж с идентификатором 2. Первый кортеж:

'2', '8', NULL, NULL, '2', '2015-09-24 09:42:31', 'sabernLogo_0.png', NULL, NULL, NULL, '180', '80', NULL, '1', NULL, NULL, '3', '1'

Я пытаюсь добавить еще один с INSERT заявление. Я вставляю без идентификатора, поэтому это выглядит так:

Insert into ag_asset 
(album_fk, parent_fk, head_fk, status_fk, modified, filename, title, `desc`, `text`, width, height, owner_fk, locked, remarks, group_fk, user_fk, type_fk)
VALUES(6, 0, null, 1, '2015-10-15 15:47:13.0', 'index.png', null, null, null, 215, 234, null, null, null, null, 3, 1);

Из того, что я понимаю, потому что мой идентификатор Autoincrement'ed, если не заполнить это, получится только что созданный идентификатор, равный 2. Вот инструкция create

CREATE TABLE `ag_asset` ( 
`id` int(10) NOT NULL AUTO_INCREMENT,
`album_fk` int(10) DEFAULT NULL,
`parent_fk` int(10) DEFAULT NULL,
`head_fk` int(10) DEFAULT NULL,
`status_fk` int(10) DEFAULT '1',
`modified` datetime NOT NULL,
`filename` varchar(255) DEFAULT NULL,
`title` varchar(255) DEFAULT NULL,
`desc` text,
`text` longtext,
`width` int(10) DEFAULT NULL,
`height` int(10) DEFAULT NULL,
`owner_fk` int(10) DEFAULT NULL,
`locked` int(10) DEFAULT NULL,
`remarks` text,
`group_fk` int(10) DEFAULT NULL,
`user_fk` int(10) DEFAULT NULL,
`type_fk` int(10) DEFAULT '1',
PRIMARY KEY (`id`),
KEY `in_filename` (`filename`(12)),
KEY `in_title` (`title`(12)),
KEY `fk_ag_asset_1` (`album_fk`),
KEY `fk_ag_asset_2` (`parent_fk`),
KEY `fk_ag_asset_3` (`head_fk`),
KEY `fk_ag_asset_4` (`status_fk`),
KEY `fk_ag_asset_5` (`owner_fk`),
KEY `fk_ag_asset_6` (`type_fk`),
CONSTRAINT `fk_ag_asset_1` FOREIGN KEY (`album_fk`) REFERENCES    `ag_album` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_ag_asset_2` FOREIGN KEY (`parent_fk`) REFERENCES `ag_asset` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_ag_asset_3` FOREIGN KEY (`head_fk`) REFERENCES `ag_asset` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `fk_ag_asset_4` FOREIGN KEY (`status_fk`) REFERENCES     `ag_status` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_ag_asset_5` FOREIGN KEY (`owner_fk`) REFERENCES `ag_owner` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_ag_asset_6` FOREIGN KEY (`type_fk`) REFERENCES `ag_type` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8;

Правильно ли я понимаю ошибку или я даже смотрю не в ту сторону?

1 ответ

Решение

В концепции внешнего ключа любое значение, которое вы пытаетесь вставить / обновить в дочерней таблице, должно существовать в его родительской / ссылочной таблице.

Здесь вы пытаетесь вставить значения, такие как 0, NULL и т. Д. В столбцы для тех, на которые вы создали ссылку, и ваша основная таблица не сохраняет эти значения.

Solution1:

Сначала добавьте эти значения в основную таблицу, а затем вставьте в дочернюю таблицу.

Solution2:

Если вы хотите принудительно добавить такие данные в дочернюю таблицу в соответствии с вашим требованием, которое не предлагается, тогда вы можете сделать следующее:

set foreign_key_checks=0;
Insert statement here...
set foreign_key_checks=1;
Другие вопросы по тегам