2012-01-08 181 views
0

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

我有以下三個表:

父表

CREATE TABLE `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 ; 

子表

CREATE TABLE `detectinglocations` (
    `userid` int(6) NOT NULL, 
    `locationid` int(6) NOT NULL auto_increment, 
    `locationname` varchar(80) NOT NULL, 
    `address` varchar(110) NOT NULL, 
    `osgb36lat` float(10,6) NOT NULL, 
    `osgb36lon` float(10,6) NOT NULL, 
    `osgridref` varchar(20) NOT NULL, 
    `wgs84latd` int(2) NOT NULL, 
    `wgs84latm` int(2) NOT NULL, 
    `wgs84lats` decimal(6,2) NOT NULL, 
    `wgs84latb` varchar(1) NOT NULL, 
    `wgs84lond` int(2) NOT NULL, 
    `wgs84lonm` int(2) NOT NULL, 
    `wgs84lons` decimal(6,2) NOT NULL, 
    `wgs84lonb` varchar(1) NOT NULL, 
    `nameoflocationcontact` varchar(30) NOT NULL, 
    `locationcontactsaddressline1` varchar(50) NOT NULL, 
    `locationcontactsaddressline2` varchar(50) default NULL, 
    `locationcontactsaddressline3` varchar(50) default NULL, 
    `locationcontactsaddressline4` varchar(50) default NULL, 
    `locationcontactstelephonenumber` varchar(15) default NULL, 
    PRIMARY KEY (`locationid`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

子表

CREATE TABLE `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 ; 

使用下面的代碼,我試圖實現'刪除級聯'功能,從而如果用戶從父表中刪除,子表中的關聯行被刪除。

ALTER TABLE 'tablename' 
    add CONSTRAINT fk_userdetails 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 

我可以成功地實現這個第一個子表,但是當我嘗試做同樣與第二子表我收到以下錯誤:

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

我已經做了相當多的一點研究,以找出問題可能是什麼,但我必須承認我沒有更聰明。

有人可能看看這個請讓我知道我做錯了什麼?

非常感謝

回答

0

的解決方案是http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html在後由馬克·羅賓斯在2007年下午10時19分,下一個9月29日:

  • 約束名稱必須是唯一
  • fk_userdetails不獨特

所以,你可以嘗試

ALTER TABLE 'tablename' 
    add CONSTRAINT fk_userdetails_detectors 
    FOREIGN KEY (userid) 
    REFERENCES userdetails(userid) 
    ON DELETE CASCADE 

在第二張桌子上

+1

無論如何不需要指定約束名稱。 MySQL會自動創建一個。所以一個簡單的'alter table X add foreign key ...'將會正常工作。 – 2012-01-08 16:20:41

+0

所以它是,但一個人類可讀和易於理解的名字可能是可取的。 – 2012-01-08 16:23:36

+0

不是真的。約束名稱只有在您刪除或修改它時才相關,並且可以通過'show create table X'調用輕鬆地檢索。 – 2012-01-08 16:25:10