删除 ON DELETE CASCADE
Posted
技术标签:
【中文标题】删除 ON DELETE CASCADE【英文标题】:remove ON DELETE CASCADE 【发布时间】:2014-10-28 09:28:55 【问题描述】:我有一个子表。和外键在创建表时使用 ON DELETE CASCADE。
子表或父表中都没有记录。
我希望主键、外键保持原样,但只想从子表中删除 CASCADING 选项。
无论如何我可以改变那个子表。
谢谢。
【问题讨论】:
【参考方案1】:表:
显示创建表表;
CREATE TABLE `table` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`id_departamento` int(11) unsigned DEFAULT NULL,
`name` varchar(30) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `id_departamento` (`id_departamento`),
CONSTRAINT `departamentos_direcciones_pedidos_ibfk_1` FOREIGN KEY (`id_departamento`) REFERENCES `departamentos` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
-
首先删除外键。
ALTER TABLE departamentos_direcciones_pedidos DROP CONSTRAINT departamentos_direcciones_pedidos_ibfk_1;
-
其次,创建正确的外键
ALTER TABLE departamentos_direcciones_pedidos ADD FOREIGN KEY (id_departamento) REFERENCES departamentos(id);
【讨论】:
【参考方案2】:ON DELETE NO ACTION | CASCADE | SET NULL | SET DEFAULT
默认为无操作。
所以尝试将您的子表改回默认值。
【讨论】:
fid number(5) 在删除级联时引用父级(pid);所以我需要在 delete set default 上发出 alter table child modify fid .....对吗?【参考方案3】:(Oracle) 您只能更改约束的状态。 ON DELETE 不是一个状态。所以你需要删除约束并重新创建它。
drop table t1 cascade constraints;
create table t1 (id number unique, rid number constraint t1_fk references t1(id) on delete cascade);
alter table t1 drop constraint t1_fk;
alter table t1 add constraint t1_fk foreign key(rid) references t1(id);
如果您使用的是 Oracle,则有不同的字典视图可以帮助您正确地重新创建约束
【讨论】:
【参考方案4】: 将数据库导出为.sql
文件
然后按ctrl + H
将所有ON DELETE CASCADE
替换为“”
然后从数据库中删除表并使用新文件实例化一个没有ON DELETE CASCADE
的新文件
【讨论】:
以上是关于删除 ON DELETE CASCADE的主要内容,如果未能解决你的问题,请参考以下文章
Django 模型外键 on_delete=null 但外键还是被删除了