在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子句,当然要小心避免破坏数据库的完整性。

http://www.openscope.net/2012/08/23/subverting-foreign-key-constraints-in-postgres-or-mysql/上有一些很好的相关讨论;

这意味着在表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 ;