2011-06-16 110 views
4

當我做這樣的事情:問題刪除行

DELETE FROM users_has_pais WHERE users_id = 151

我收到以下錯誤信息:

SQLSTATE [23000]:誠信約束衝突:1451無法刪除或更新父行:外鍵約束失敗(giseleusers_has_pais,CONSTRAINT users_has_pais_ibfk_3 FOREIGN KEY(users_id)參考文獻usersid)ON DELETE NO ACTION ON UPDATE NO ACTION)

我不知道是什麼問題,但我猜它有什麼用ON做DELETE NO ACTION。我不知道我應該改變,要雖然...參考我貼我的表結構的轉儲:

CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`email` varchar(50) DEFAULT NULL, 
`password` varchar(250) DEFAULT NULL, 
`url` varchar(50) DEFAULT NULL, 
`responsable` varchar(50) DEFAULT NULL, 
`role` varchar(25) DEFAULT NULL, 
`fecha` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`), 
UNIQUE KEY `email` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=162 ; 

CREATE TABLE IF NOT EXISTS `pais` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`pais` varchar(20) NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `pais` (`pais`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

users_has_pais | CREATE TABLE `users_has_pais` (
`id` int(11) NOT NULL AUTO_INCREMENT, 
`users_id` int(11) NOT NULL, 
`pais_id` int(11) NOT NULL, 
PRIMARY KEY (`id`), 
KEY `user` (`users_id`), 
KEY `index3` (`pais_id`), 
KEY `users_id` (`users_id`), 
KEY `pais_id` (`pais_id`), 
CONSTRAINT `users_has_pais_ibfk_3` FOREIGN KEY (`users_id`) REFERENCES `users` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
CONSTRAINT `users_has_pais_ibfk_2` FOREIGN KEY (`pais_id`) REFERENCES `pais` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=latin1 | 

編輯: pastie of the constraint information

+0

你能找到併發布約束「users_has_pais_ibfk_3」的定義嗎? – mtazva 2011-06-16 19:24:54

+0

@mtazva我已經複製了我在留言板中留下的關於約束鏈中的約束條件的信息。不確定這是否是你要求我的,但 – 2011-06-16 19:42:33

+0

約束似乎是正確定義的 - 它只是一個預感作爲@Adrian)。對不起,那是我唯一的線索。如果有其他事情打我,我會回來。 – mtazva 2011-06-16 20:02:46

回答

0

我的SQL知識是不完全頂尖,但它看起來像你刪除了被引用爲外鍵的東西。

+0

我怎麼能解決這個問題? – 2011-06-16 19:30:43

+1

你不「解決它」。這是數據庫中定義的完整性規則,您必須遵守它。這意味着要麼刪除所有內容(我的意思是涉及所有行),要麼刪除任何內容。如果您「刪除了所有內容」,則由您決定是通過級聯刪除,應用程序控制刪除,表中的刪除觸發器還是通過將整個操作放入存儲過程來完成此操作。 RacerX在他的評論中指出了級聯刪除的危險。 – 2011-06-21 14:42:21

3

您正試圖刪除另一個表中的約束所引用的記錄。因此,你需要做以下之一:

  • 更改約束級聯刪除(或者其他約束規則),如果在你的邏輯是有道理的
  • 警告該問題的用戶,並勸他刪除其他對象優先
  • 使您的應用程序刪除依賴行,然後刪除您要刪除的行(按照@RacerX評論)。

更新

更多的細節查看你的數據結構後,我懷疑你的約束可能會向後定義。你能發佈約束定義嗎?

+0

我更喜歡讓應用程序首先刪除相關的FK行,然後刪除相關的行。級聯刪除很好,但它們消除了FK提供的一個安全措施。如果應用程序失控(錯誤)設計它與大量級聯刪除可能是一個問題。 – RacerX 2011-06-16 19:32:37

+0

我知道。這就是我給OP選項的原因。 OP必須知道他能做什麼。此外,還有像越野車FKs(錯誤定義的)的東西 – 2011-06-16 19:33:53

+0

我剛剛發佈的約束信息在pastie鏈接 – 2011-06-16 19:43:23