[英]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![]() |
role_1![]() |
permit_2![]() |
role_1![]() |
permit_3![]() |
role_3![]() |
permit_4![]() |
role_1![]() |
permit_4![]() |
role_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.