我想知道是否有人可以帮助我。
我想使用'删除级联'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
答案 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