我可以在每个查询的基础上在PostgreSQL中指定ON DELETE行为吗?

时间:2018-12-24 15:13:32

标签: postgresql

假设我有一个Albums表和一个Tracks表。轨道上有一个album列,它是Album表的外键,但是该字段可以为空。不过,当我尝试删除相册时,仍然出现完整性错误:

Key (id)=(123) is still referenced from table "Track".

这一次我想强制执行ON DELETE SET NULL行为。有可能吗?

1 个答案:

答案 0 :(得分:0)

这是因为您已经设置了外键约束来引发错误,而不是级联删除或设置为空。您有两种选择:

  1. ALTER TABLE查询之前和之后执行DELETE,以更改约束。确保DELETE包装在错误处理结构中(使用与PostgreSQL等效的finally),以确保即使代码引发错误,约束也被重置为其原始行为。

  2. 将查询更改为UPDATE-然后-DELETE。这可能是比更改约束最明智的方法:

    UPDATE Tracks SET AlbumId = NULL WHERE AlbumId = 123
    
    DELETE FROM Albums WHERE AlbumId = 123