【问题标题】:Why is my insert statement failing?为什么我的插入语句失败?
【发布时间】:2016-01-17 14:09:23
【问题描述】:

我正在尝试添加到我的数据库表中,但似乎出现错误。我收到 1452 错误。这就是我认为的问题所在:我认为我的 parent_fk 指的是一个尚不存在的 id。至少这是我对以下错误的理解:

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)

假设我的数据库中有一个 id 为 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 语句添加另一个。我正在插入没有 id,所以它看起来像这样:

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

据我了解,因为我的 id 是 Autoincrement'ed,所以不填写会导致新制作的 id 为 2。 这是创建语句

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;

我是否正确理解了错误,或者我什至看错了方向?

【问题讨论】:

  • 你是对的。 parent_fk 设置为 0。尝试将其更改为NULL。 IE。 VALUES(6, null, null, ...

标签: mysql sql-insert mysql-error-1452


【解决方案1】:

在外键概念中,您尝试在子表中插入/更新的任何值都必须存在于其父/引用表中。

在这里,您尝试在已创建引用的列中插入 0、NULL 等值,而您的主表不保留这些值。

解决方案1:

要么先将这些值添加到主表中,然后再插入到子表中。

解决方案2:

如果您想根据您的要求在子表中强制添加此类数据,但不建议您可以这样做-

set foreign_key_checks=0;
Insert statement here...
set foreign_key_checks=1;

【讨论】:

  • 是的,我就是这么想的。不幸的是,我没有创建数据库。似乎没有人知道什么是空的 fk。由于它没有被使用,我建议删除引用自身的 fk,因为它没有被使用。感谢您的答复。我知道关闭 fk 检查以添加某些内容然后再次打开它是不可取的。从这个意义上说,fk不是没用吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多