mysql数据库,我想删除一张表,这张表的主键又作为其它多张表的外键,InnoDB,且设置了删除cascade。

mysql数据库,我想删除一张表,这张表的主键又作为其它多张表的外键,InnoDB,且设置了删除cascade。,第1张

这样的 *** 作明显违法了当初如此进行这些表关系设计的初衷。

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目前不支持。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8355576.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-15
下一篇 2023-04-15

发表评论

登录后才能评论

评论列表(0条)

保存