在PostgreSQL中用外键删除行
我想删除包含外键的行,但是当我尝试这样的事情:
DELETE FROM osoby WHERE id_osoby='1'
我得到这个声明:
错误:更新或删除表“osoby”违反了表“kontakty”上的外键约束“kontakty_ibfk_1”详细信息:键(id_osoby)=(1)仍然从表“kontakty”引用。
我怎样才能删除这些行?
要自动执行此操作,可以使用ON DELETE CASCADE
定义外键约束。
我引用了外键约束的手册 :
CASCADE
指定当被引用的行被删除时,引用它的行也应该被自动删除。
如果仍然引用另一个表,则不能删除外键。 首先删除参考
delete from kontakty where id_osoby = 1; DELETE FROM osoby WHERE id_osoby = 1;
一个不应该build议这是一个通用的解决scheme,但是对于一次性删除数据库中未处于生产或活动状态的行,您可能会暂时禁用相关表中的触发器。
在我的情况下,我处于开发模式,并有一些通过外键相互引用的表。 因此,删除它们的内容并不像从一个表格中删除所有行之前一样简单。 所以,对我来说,删除他们的内容,如下所示:
ALTER TABLE table1 DISABLE TRIGGER ALL; ALTER TABLE table2 DISABLE TRIGGER ALL; DELETE FROM table1; DELETE FROM table2; ALTER TABLE table1 ENABLE TRIGGER ALL; ALTER TABLE table2 ENABLE TRIGGER ALL;
您应该可以根据需要添加WHERE子句,当然要小心避免破坏数据库的完整性。
这意味着在表kontakty
你有一行引用你想删除的osoby
的行。 您必须首先删除该行,或者对表之间的关系设置级联删除。
Powodzenia!
自问这个问题已经有一段时间了,希望能有所帮助。 因为你不能改变或改变数据库结构,你可以这样做。 根据postgresql 文档 。
TRUNCATE – 清空一个表格或一组表格。
TRUNCATE [ TABLE ] [ ONLY ] name [ * ] [, ... ] [ RESTART IDENTITY | CONTINUE IDENTITY ] [ CASCADE | RESTRICT ]
描述
TRUNCATE快速删除一组表中的所有行。 它与每个表上的不合格DELETE具有相同的效果,但由于它实际上并不扫描表,所以速度更快。 此外,它立即回收磁盘空间,而不是要求后续的VACUUM操作。 这在大型表格上最有用。
截断表othertable,并级联到任何通过外键约束引用其他表的表:
TRUNCATE othertable CASCADE;
同样的,也重置任何相关的序列生成器:
TRUNCATE bigtable, fattable RESTART IDENTITY;
截断并重置任何关联的序列生成器:
TRUNCATE revinfo RESTART IDENTITY CASCADE ;