我们可以在PostgreSQL中删除行,并将删除级联到使用Ref ID/ Foreign key约束的不同表中的所有相关行吗?

dauxcl2d  于 2023-10-18  发布在  PostgreSQL
关注(0)|答案(1)|浏览(148)

如何在PostgreSQL中使用Ref ID或Foreign Key约束对不同表中的所有相关行执行级联效果的行删除?如果可能的话,我想在pgadmin4 GUI中使用此功能。
当我试图删除一行时,它给出以下错误,
SQL Error [23503]: ERROR: update or delete on table "tbl_xyz" violates foreign key constraint "tbl_abc_id_2b79de29_fk_tbl" on table "tbl_abc" Detail: Key (id)=(110) is still referenced from table "tbl_abc".

ccrfmcuu

ccrfmcuu1#

这当然是可能的。PostgreSQL在删除行时的行为取决于外键的属性。在我看来,应该始终设置ON DELETEON UPDATE设置,以便用户意识到行为。

  1. CREATE TABLE parent(
  2. id int primary key,
  3. info text
  4. );
  5. CREATE TABLE child(
  6. id int primary key,
  7. parent_id int REFERENCES parent(id) ON DELETE CASCADE ON UPDATE CASCADE,
  8. info text
  9. );
  10. INSERT INTO parent(id, info) VALUES
  11. (1, 'parent1'),
  12. (2, 'parent2')
  13. ;
  14. INSERT INTO child(id, parent_id, info) VALUES
  15. (1, 1, 'child1 of parent1'),
  16. (2, 1, 'child2 of parent1'),
  17. (3, 2, 'child1 of parent2'),
  18. (4, 2, 'child2 of parent2')
  19. ;
  20. DELETE FROM parent WHERE id = 1;
  21. SELECT * FROM child;
  22. id | parent_id | info
  23. ----+-----------+-------------------
  24. 3 | 2 | child1 of parent2
  25. 4 | 2 | child2 of parent2

ON DELETE操作具有以下选项:|行动|描述||:--|:-||没有行动|如果存在引用对象,则防止删除父对象。在提交时进行检查。(预设值)||限制|如果存在引用对象,则防止删除父对象。在命令后立即进行检查。||级联|删除父项时,也会删除所有子项||SET NULL|删除父级时,parent_id字段对于所有引用行都设置为空。||SET NULL|删除父级时,parent_id字段将设置为所有引用行的默认值。|

展开查看全部

相关问题