我最近開始嘗試使用外鍵來使自己的數據庫管理更容易。我正在試圖弄清楚他們是如何工作的,而且大多數時候我可以在表格之間正常工作而沒有問題。但是我目前對我的兩張桌子有問題,我無法弄清楚。外鍵完整性約束違規:1452
我得到一個錯誤:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (
REDACTED
.rc_logs
, CONSTRAINTrc_logs_ibfk_1
FOREIGN KEY (user_id
) REFERENCESrc_teammates
(uid
) ON DELETE CASCADE ON UPDATE 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表開始新鮮。
我真的不知道這一點,並會愛任何指針。謝謝!
嗨。您可能在rc_logs表中具有rc_teammates表中不存在的user_id條目的數據? (由於auto_increment偏移,我假設你已經有了數據) – Ossip
嘗試類似這樣的操作來查找違反外鍵的條目:'select rc_logs.uid,rc_logs.user_id,rc_teammates.uid from rc_logs left join rc_teammates on rc_logs.user_id = rc_teammates.uid rc_teammates.uid爲空;' – Ossip
@Ossip我認爲我錯誤地清空了數據。我現在無法到達我的電腦,所以我將盡快調查這個問題 – GrumpyCrouton