删除级联多个表

时间:2012-01-08 16:03:03

标签: mysql

我想知道是否有人可以帮助我。

我有以下三个表:

父表

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) 

我已经做了很多研究以找出问题所在,但我必须承认我不是更聪明。

有人可能请一看这个,让我知道我做错了什么?

非常感谢

1 个答案:

答案 0 :(得分:0)

解决方案是由Mark Robbins在2007年9月29日晚上10:19和下一个帖子中发表的http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html

  • 约束名称必须是唯一的
  • fk_userdetails不是唯一的

所以你可以试试

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

在第二个表上