2012-01-07 153 views
1

我想知道是否有人可以幫助我。MySQL刪除級聯

我想要使用「刪除級聯」mySQL功能,以便從「用戶詳細信息」表中刪除用戶時,它會從我的數據庫中的其他表中刪除它們的記錄。

通過閱讀Stackoverflow上的一些帖子和我在互聯網上進行的研究之後,我將表格更改爲InnoDB,並開始更改現有表格。

我已經能夠「刪除級聯外鍵」添加到我的第一個表,但是當我試圖做同樣的任何其他表,我收到以下錯誤:

#1005 - Can't create table './db369054642/#sql-30d_bd1a57.frm' (errno: 121) 

但我不確定爲什麼我會收到此錯誤,因爲我更改的第一張表格沒有任何問題。

有人可以告訴我,你只能將父表連接到一個子表嗎?

父表(用戶詳情)

DROP TABLE IF EXISTS `userdetails`; 
CREATE TABLE IF NOT EXISTS `userdetails` (
    `userid` int(6) NOT NULL auto_increment, 
    `forename` varchar(20) NOT NULL, 
    `surname` varchar(30) NOT NULL, 
    `emailaddress` varchar(150) NOT NULL, 
    `password` varchar(200) NOT NULL, 
    `passwordhint` varchar(20) NOT NULL, 
    `subscriptionexpiration` date NOT NULL, 
    `salt` varchar(200) NOT NULL, 
    PRIMARY KEY (`userid`), 
    UNIQUE KEY `emailaddress` (`emailaddress`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

子表(檢測器)

DROP TABLE IF EXISTS `detectors`; 
CREATE TABLE IF NOT EXISTS `detectors` (
    `userid` int(6) NOT NULL, 
    `detectorid` int(6) NOT NULL auto_increment, 
    `detectorname` varchar(30) NOT NULL, 
    PRIMARY KEY (`detectorid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 PACK_KEYS=0 AUTO_INCREMENT=1 ; 

刪除級聯SQL語句

ALTER TABLE detectors 
    add CONSTRAINT fk_userdetails 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 
+0

通常嫌疑犯如表全/磁盤已滿等被排除在外,我想? – 2012-01-07 15:23:21

+0

發佈您的架構和查詢請 – 2012-01-07 15:37:19

+0

谷歌總是錯誤消息的第一大資源。當我將搜索錯誤插入搜索時,我會得到這個論壇的討論,以及其他幾個點擊 - http://forums.mysql.com/read.php?22,33999,76181#msg-76181。請爲您遇到問題的兩個表(源代碼和目標代碼)發佈'SHOW CREATE TABLE * tableName *'。另外,請發佈您嘗試使用的SQL來更改源表。 – Perception 2012-01-07 15:38:55

回答

2

您的表格和被引用的表格是否在涉及的列上有索引

http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html

InnoDB requires indexes on foreign keys and referenced keys so that foreign key checks can be fast and not require a table scan. In the referencing table, there must be an index where the foreign key columns are listed as the first columns in the same order. Such an index is created on the referencing table automatically if it does not exist. (This is in contrast to some older versions, in which indexes had to be created explicitly or the creation of foreign key constraints would fail.) index_name, if given, is used as described previously.

嘗試首先創造必要的指標,或向我們展示從SHOW CREATE TABLE yourTableName輸出,使我們可以檢查是否存在索引,並且沒有名稱衝突。

2

看看perror實用程序(它包含在mysql分發中)。它給出了關於錯誤代碼的更詳細的解釋並且從你的命令行運行。在你的情況下,錯誤號碼是121,所以你在命令行中運行以下命令:

perror 121 

http://dev.mysql.com/doc/refman/5.0/en/perror.html