SQLSTATE [23000]:完整性约束违规:1452无法添加或更新子行:外键约束失败

时间:2013-07-15 06:44:42

标签: mysql sql

我正在尝试将值插入到我的评论表中,但是我收到了错误消息。它说我无法添加或更新子行,我不知道这意味着什么。 我的架构看起来像这样:

--
-- Baza danych: `koxu1996_test`
--

-- --------------------------------------------------------

--
-- Struktura tabeli dla tabeli `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) COLLATE utf8_bin NOT NULL,
  `password` varchar(64) COLLATE utf8_bin NOT NULL,
  `password_real` char(32) COLLATE utf8_bin NOT NULL,
  `email` varchar(32) COLLATE utf8_bin NOT NULL,
  `code` char(8) COLLATE utf8_bin NOT NULL,
  `activated` enum('0','1') COLLATE utf8_bin NOT NULL DEFAULT '0',
  `activation_key` char(32) COLLATE utf8_bin NOT NULL,
  `reset_key` varchar(32) COLLATE utf8_bin NOT NULL,
  `name` varchar(32) COLLATE utf8_bin NOT NULL,
  `street` varchar(32) COLLATE utf8_bin NOT NULL,
  `house_number` varchar(32) COLLATE utf8_bin NOT NULL,
  `apartment_number` varchar(32) COLLATE utf8_bin NOT NULL,
  `city` varchar(32) COLLATE utf8_bin NOT NULL,
  `zip_code` varchar(32) COLLATE utf8_bin NOT NULL,
  `phone_number` varchar(16) COLLATE utf8_bin NOT NULL,
  `country` int(8) NOT NULL,
  `province` int(8) NOT NULL,
  `pesel` varchar(32) COLLATE utf8_bin NOT NULL,
  `register_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `authorised_time` datetime NOT NULL,
  `edit_time` datetime NOT NULL,
  `saldo` decimal(9,2) NOT NULL,
  `referer_id` int(8) NOT NULL,
  `level` int(8) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `country` (`country`),
  KEY `province` (`province`),
  KEY `referer_id` (`referer_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=83 ;

我想做的mysql语句看起来像这样:

INSERT INTO `user` (`password`, `code`, `activation_key`, `reset_key`, `register_time`,                `edit_time`, `saldo`, `referer_id`, `level`) VALUES (:yp0, :yp1, :yp2, :yp3, NOW(), NOW(), :yp4, :yp5, :yp6). Bound with :yp0='fa1269ea0d8c8723b5734305e48f7d46', :yp1='F154', :yp2='adc53c85bb2982e4b719470d3c247973', :yp3='', :yp4='0', :yp5=0, :yp6=1

我得到的错误如下:

  

SQLSTATE [23000]:完整性约束违规:1452无法添加或   更新子行:外键约束失败   (koxu1996_testuser,CONSTRAINT user_ibfk_1 FOREIGN KEY   (country)引用country_typeid)ON DELETE NO ACTION ON   更新无行动)

7 个答案:

答案 0 :(得分:21)

它只是意味着您要插入的表格注释中的列国家/地区的值在 country_type 表格中不存在,或者您没有在表格用户。 请记住,表格注释中列国家/地区的值取决于表格 country_type 上的ID值。

答案 1 :(得分:5)

此表与另一个表之间有外键,新行将违反该约束。

如果您运行show create table user,您应该能够看到约束,它显示为CONSTRAINT...,并显示哪些列引用了哪些表/列。

在这种情况下,country引用country_type (id)并且您没有指定country的值。您需要设置country_type中存在的值。

答案 2 :(得分:1)

只是抛出我自己的问题,以防它可以帮助别人,我在我的迁移文件中复制/粘贴条目,并通过在整数周围加上引号搞砸了。由于我试图输入的值被认为是一个字符串进入一个引用另一个整数的整数字段,因此出现了这个错误。

答案 3 :(得分:1)

对于我来说,在 SQL 命令中没有问题,但是输入不是作为 $ request 发送的,因此在php.ini文件中:

max_input_vars默认为1000,我将其更改为:

max_input_vars = 2000

然后您必须重新启动Web服务器。

答案 4 :(得分:0)

另一个选项可能是你的源表中的主键不是无符号的,所以我解决了相同的插入(注意id int(8)unsigned):

  

CREATE TABLE IF NOT EXISTS userid int(8)unsigned NOT NULL   AUTO_INCREMENT,username varchar(32)COLLATE utf8_bin NOT NULL,
  password varchar(64)COLLATE utf8_bin NOT NULL,password_real   char(32)COLLATE utf8_bin NOT NULL,email varchar(32)COLLATE   utf8_bin NOT NULL,code char(8)COLLATE utf8_bin NOT NULL,
  activated枚举(' 0',' 1')收集utf8_bin NOT NULL默认' 0',
  activation_key char(32)COLLATE utf8_bin NOT NULL,reset_key   varchar(32)COLLATE utf8_bin NOT NULL,name varchar(32)COLLATE   utf8_bin NOT NULL,street varchar(32)COLLATE utf8_bin NOT NULL,
  house_number varchar(32)COLLATE utf8_bin NOT NULL,
  apartment_number varchar(32)COLLATE utf8_bin NOT NULL,city   varchar(32)COLLATE utf8_bin NOT NULL,zip_code varchar(32)   COLLATE utf8_bin NOT NULL,phone_number varchar(16)COLLATE   utf8_bin NOT NULL,country int(8)NOT NULL,province int(8)   NOT NULL,pesel varchar(32)COLLATE utf8_bin NOT NULL,
  register_time时间戳NOT NULL DEFAULT CURRENT_TIMESTAMP,
  authorised_time datetime NOT NULL,edit_time datetime NOT NULL,   saldo十进制(9,2)NOT NULL,referer_id int(8)NOT NULL,
  level int(8)NOT NULL,PRIMARY KEY(id),KEY country   (country),键provinceprovince),键referer_id   (referer_id))ENGINE = InnoDB DEFAULT CHARSET = utf8 COLLATE = utf8_bin   AUTO_INCREMENT = 83;

答案 5 :(得分:0)

就我而言,目标表列的值为空,而引用表列具有该值。因此抛出了这个错误。

答案 6 :(得分:0)

在我的情况下,引用值在相关表上不对应。只需确保参考表上存在值,并且当前行具有相应的有效值。