如何从父表中删除多个子表引用的记录?

时间:2016-03-25 09:45:35

标签: sql sql-server tsql foreign-keys

我有一个由多个表(大约52个)引用的表,而且,很少有子表也有多个外键也引用其他表。

我想删除父表中的记录,我无法这样做,因为我收到错误“DELETE语句与REFERENCE约束冲突”FK_xxx“。冲突发生在数据库”MyDB“,表”dbo .A“,列'x'。”

我想要一个通用的T-SQL解决方案,它与表和引用数无关。

2 个答案:

答案 0 :(得分:1)

您必须查看"删除" keyword是外键约束定义的一部分。 基本上你有4个选择:

  • NO ACTION(什么都不做)
  • CASCADE(删除孩子)
  • SET NULL(将引用字段设置为null)
  • SET DEFAULT(将参考字段设置为默认值)

一个例子是:

CREATE TABLE parent (
    id INT NOT NULL,
    PRIMARY KEY (id)
) ENGINE=INNODB;

CREATE TABLE child (
    id INT, 
    parent_id INT,
    INDEX par_ind (parent_id),
    FOREIGN KEY (parent_id) 
        REFERENCES parent(id)
        ON DELETE CASCADE -- replace CASCADE with your choice
) ENGINE=INNODB;

(有关此示例以及更多详细信息,请参阅此处:http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

如果您现在想要修改约束,首先必须删除它,然后创建一个新约束,例如:

ALTER TABLE child 
ADD CONSTRAINT fk_name 
FOREIGN KEY (parent_id) 
REFERENCES parent(id) 
ON DELETE CASCADE; -- replace CASCADE with your choice

我希望这有帮助。另外要提一下,你应该考虑一下可能不是真的删除你的父母,而是创建另一个布尔列"删除",你填写"是"如果有人点击删除。在"选择" -query中过滤然后按"删除"柱。 优点是,您不会丢失此条目的历史记录。

答案 1 :(得分:0)

您的问题是:FK约束旨在阻止您在52个表中的任何一个表中创建孤立子记录。我可以为您提供您所寻找的脚本,但您必须首先意识到,当您尝试重新启用FK约束时,由于孤立数据(FK约束旨在防止),约束将无法重新启用。对于下一步,无论如何都必须首先删除52个表中每个表中的孤立数据。实际上,使用ON DELETE CASCADE重做约束要容易得多,或者删除约束并完全忘记引用完整性。你无法双管齐下。