2017-10-11 150 views
0

我最近開始嘗試使用外鍵來使自己的數據庫管理更容易。我正在試圖弄清楚他們是如何工作的,而且大多數時候我可以在表格之間正常工作而沒有問題。但是我目前對我的兩張桌子有問題,我無法弄清楚。外鍵完整性約束違規:1452

我得到一個錯誤:

SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (REDACTED . rc_logs , CONSTRAINT rc_logs_ibfk_1 FOREIGN KEY (user_id) REFERENCES rc_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表開始新鮮。

我真的不知道這一點,並會愛任何指針。謝謝!

+0

嗨。您可能在rc_logs表中具有rc_teammates表中不存在的user_id條目的數據? (由於auto_increment偏移,我假設你已經有了數據) – Ossip

+0

嘗試類似這樣的操作來查找違反外鍵的條目:'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

+0

@Ossip我認爲我錯誤地清空了數據。我現在無法到達我的電腦,所以我將盡快調查這個問題 – GrumpyCrouton

回答

1

正如你所說你已經「清空」(TRUNCATE?)表rc_teammates。 並嘗試在rc_logs插入一條記錄,而這個記錄有不存在rc_teammates,從而違反以下約束的user_id

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

就在rc_teammates添加一條記錄,有uid相等到您嘗試在rc_logs中插入記錄的user_id,然後重試。


此外,關於這一點:

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就足夠了。這也適用於您的其他表格。

+0

其實我所做的是選擇了所有的行並刪除它們。我認爲它開始時我試圖截斷一個外鍵錯誤,所以我做了一個解決方法 – GrumpyCrouton

+0

事實證明,當我使用'asort'排序我的數據數組時,它重置了數組索引,這是我的隊友的關鍵。我通過切換到'uasort'來解決這個問題,它保持相同的索引。那真是令人頭疼的x.x – GrumpyCrouton

相關問題