简体   繁体   English

Postgresql - 违反唯一约束时更新行或删除

[英]Postgresql - update rows or delete on unique constraint violation

I have a many-to-many table 'permit_role' as below:我有一个多对多表“permit_role”,如下所示:

permit_id许可证编号 role_id角色编号
permit_1许可证_1 role_1角色_1
permit_2许可_2 role_1角色_1
permit_3许可_3 role_3角色_3
permit_4许可证_4 role_1角色_1
permit_4许可证_4 role_2角色_2

It has a unique constraint (permit_id, role_id) .它有一个唯一的约束(permit_id, role_id)

I need to update permits as below:我需要更新许可证如下:

permit_1 --> permit_5许可_1 --> 许可_5

permit_2 --> permit_5许可_2 --> 许可_5

So it`s impossible to do just所以不可能只做

UPDATE permit_role SET permit_id = 'permit_5' WHERE permit_id = 'permit_1';

UPDATE permit_role SET permit_id = 'permit_5' WHERE permit_id = 'permit_2';

because I`ll got a unique constraint violation (two rows with (permit_5, role_1)).因为我会违反唯一约束(两行带有(permit_5,role_1))。 In this case I need the duplicated rows just to be deleted so I have only one such row in the end.在这种情况下,我只需要删除重复的行,所以最后只有一个这样的行。

I thought about temp tables but it seems to difficult, please advise what is the easiest way to achieve my goal.我考虑过临时表,但似乎很难,请告知实现我的目标最简单的方法是什么。

Try a CTE:尝试 CTE:

WITH old_rows AS (
   DELETE FROM permit_role
   WHERE permit_id = 'permit_1'
   RETURNING role_id
)
INSERT INTO permit_role (permit_id, role_id)
SELECT 'permit_5', role_id
FROM old_rows
ON CONFLICT (permit_id, role_id) DO NOTHING;

Then repeat for permit_2 .然后重复permit_2 The ON CONFLICT clause will keep you from inserting duplicates without getting an error. ON CONFLICT子句将防止您插入重复项而不会出错。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM