外键完整性约束违规:1452

时间:2017-10-11 21:03:42

标签: mysql foreign-keys

我最近开始尝试使用外键来简化数据库管理。我正在努力弄清楚它们实际上是如何工作的,并且大多数时候我可以让它在没有问题的情况下在表之间工作。但是我目前在我的两张桌子上遇到了问题,我无法弄明白。

我收到了一个错误:

  

SQLSTATE [23000]:完整性约束违规:1452无法添加或   更新子行:外键约束失败   (REDACTEDrc_logs,CONSTRAINT rc_logs_ibfk_1外国   KEY(user_id)REFERENCES rc_teammatesuid)ON DELETE CASCADE ON   更新CASCADE)   [/home5/redacted/public_html/redacted/rc/public/assets/php/connection.php:25]

但我的桌子似乎设置得很好,我真的很困惑为什么它不起作用。这是我的表结构:

rc_teammates

CREATE TABLE `rc_teammates` (
  `uid` int(11) NOT NULL,
  `name` text NOT NULL,
  `primary_line` int(11) NOT NULL,
  `hireStatus` text NOT NULL,
  `created_on` date NOT NULL,
  `active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `rc_teammates`
  ADD PRIMARY KEY (`uid`), ADD UNIQUE KEY `uid` (`uid`), ADD KEY `primary_line` (`primary_line`), ADD KEY `primary_line_2` (`primary_line`);

ALTER TABLE `rc_teammates`
  MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT;

ALTER TABLE `rc_teammates`
ADD CONSTRAINT `rc_teammates_ibfk_1` FOREIGN KEY (`primary_line`) REFERENCES `rc_lines` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE;

rc_logs

CREATE TABLE IF NOT EXISTS `rc_logs` (
  `uid` int(11) NOT NULL,
  `user_id` int(11) NOT NULL,
  `line` int(11) NOT NULL,
  `date` date NOT NULL,
  `type` varchar(15) NOT NULL,
  `timein` time NOT NULL,
  `timeout` time NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=53 DEFAULT CHARSET=latin1;

ALTER TABLE `rc_logs`
  ADD PRIMARY KEY (`uid`), ADD KEY `user_id` (`user_id`), ADD KEY `line` (`line`), ADD KEY `user_id_2` (`user_id`);

ALTER TABLE `rc_logs`
  MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=53;
ALTER TABLE `rc_logs`
ADD CONSTRAINT `rc_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `rc_teammates` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `rc_logs_ibfk_2` FOREIGN KEY (`line`) REFERENCES `rc_lines` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE;

我试图查找错误,之前我遇到过这个问题,但我不记得我是怎么解决的。更糟糕的是,这工作得更早,直到我清空rc_teammates表开始新鲜。

我真的无法理解这一点,并且会喜欢任何指针。谢谢!

1 个答案:

答案 0 :(得分:1)

正如你所说,你已经“清空”(TRUNCATE?)表rc_teammates。 并且您尝试在rc_logs中插入记录,并且此记录在user_id中不存在rc_teammates,因此违反了以下约束:

ADD CONSTRAINT `rc_logs_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `rc_teammates` (`uid`) ON DELETE CASCADE ON UPDATE CASCADE 

只需在rc_teammates中添加一条记录,uid等于您要在user_id中插入的记录的rc_logs,然后重试。

另外,关于这个:

ALTER TABLE `rc_teammates`
  ADD PRIMARY KEY (`uid`), ADD UNIQUE KEY `uid` (`uid`),

ALTER TABLE `rc_teammates`
  MODIFY `uid` int(11) NOT NULL AUTO_INCREMENT;

当您将列设置为PRIMARY KEY时,它实际上是:UNIQUENOT NULLINDEXED。你不需要指定所有这些,PRIMARY KEY就足够了。这对你的其他桌子也有效。