我有一个由多个表(大约52个)引用的表,而且,很少有子表也有多个外键也引用其他表。
我想删除父表中的记录,我无法这样做,因为我收到错误“DELETE语句与REFERENCE约束冲突”FK_xxx“。冲突发生在数据库”MyDB“,表”dbo .A“,列'x'。”
我想要一个通用的T-SQL解决方案,它与表和引用数无关。
答案 0 :(得分:1)
您必须查看"删除" keyword是外键约束定义的一部分。 基本上你有4个选择:
一个例子是:
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重做约束要容易得多,或者删除约束并完全忘记引用完整性。你无法双管齐下。