MySQL删除级联

时间:2012-01-07 15:16:16

标签: mysql

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

我想使用'删除级联'mySQL功能,这样当用户从'用户详细信息'表中删除时,它会从我数据库中的其他表中删除它们的记录。

在阅读了Stackoverflow上的一些帖子以及我在互联网上进行的研究后,我将表格更改为InnoDB并开始更改现有表格。

我已经能够将'删除Cascade与外键'添加到我的第一个表中,但是当我尝试对任何其他表执行相同操作时,我收到以下错误:

#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

2 个答案:

答案 0 :(得分:2)

您的表和引用的表在所涉及的列上都有索引吗?

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

  

InnoDB需要外键和引用键的索引   外键检查可以很快,不需要表扫描。在里面   引用表时,必须有一个索引所在的外键   列以相同顺序列为第一列。这样的   如果不是,则会自动在引用表上创建索引   存在。 (这与某些旧版本形成对比,其中包含索引   必须明确创建或创建外键   约束将失败。)index_name,如果给定,则按所述方式使用   先前。

首先尝试创建必要的索引,或者向我们展示SHOW CREATE TABLE yourTableName的输出,这样我们就可以检查索引是否存在且没有名称冲突。

答案 1 :(得分:2)

查看perror实用程序(它包含在mysql distibutions中)。它提供了有关错误代码的更详细说明,并从命令行运行。您的案例中的错误号是121,因此您可以在命令行上运行它:

perror 121

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