2012-01-08 131 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