我最近开始尝试使用外键来简化数据库管理。我正在努力弄清楚它们实际上是如何工作的,并且大多数时候我可以让它在没有问题的情况下在表之间工作。但是我目前在我的两张桌子上遇到了问题,我无法弄明白。
我收到了一个错误:
SQLSTATE [23000]:完整性约束违规:1452无法添加或 更新子行:外键约束失败 (
REDACTED
。rc_logs
,CONSTRAINTrc_logs_ibfk_1
外国 KEY(user_id
)REFERENCESrc_teammates
(uid
)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表开始新鲜。
我真的无法理解这一点,并且会喜欢任何指针。谢谢!
答案 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
时,它实际上是:UNIQUE
,NOT NULL
和INDEXED
。你不需要指定所有这些,PRIMARY KEY就足够了。这对你的其他桌子也有效。