cascade用处在于,你删除某条记录时,如果主键值被删除,那么级联删除子表的相关数据。
不适用于你现在的情况:删除主表!!!
还是建议你想好,为什么要删除此表。
安全起见的话,先删除各个外键,再删除主表;建议删除主表前,先备份(以免后悔)
请试试下面这段代码, ON DELETE CASCADE是成功的。我推测,你可能把主动和被动表弄错了。下面这个例子table_a 是主动表,table_b引用table_a中的username,并建立了级联删除。也就是删除table_a(主动表)的记录时,会级联删除table_b(被动表)的记录。
CREATE TABLE `table_a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(45) NOT NULL,
`remark` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
CREATE TABLE `table_b` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`IDCard` varchar(18) NOT NULL,
`username` varchar(45) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `IDCard_UNIQUE` (`IDCard`),
KEY `username_a_b` (`username`),
CONSTRAINT `username_a_b` FOREIGN KEY (`username`) REFERENCES `table_a` (`username`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1
insert into table_a(username, remark) values('derek','remark for derek')
insert into table_a(username, remark) values('bill', 'remark for bill')
insert into table_b(username, idcard) values('derek','3323456789')
insert into table_b(username, idcard) values('bill','123456789')
delete from table_a where username='derek'
看看外键的 级联 选项, 是CASCADE 的 才可以级联删除:[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION 外键的使用需要满足下列的条件:
InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:
1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
3. NO ACTION: InnoDB拒绝删除或者更新父表。
4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
5. SET DEFAULT: InnoDB目前不支持。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)