我在一个用户管理系统上工作,我需要在用户被删除之前将其复制到一个“备份”表中。当两个表上的id
都是唯一的时,如何将userid
设置为新列id
?
用户
+----+------+-------------+--+
| id | lang | email | |
+----+------+-------------+--+
| 20 | en | [email protected] | |
+----+------+-------------+--+
妄想者
+----+--------+------+-------------+
| id | userid | lang | email |
+----+--------+------+-------------+
| 1 | 20 | en | [email protected] |
+----+--------+------+-------------+
最佳答案
首先,如果用户不能被删除两次,delusers.id
可以是PRIMARY KEY
表的delusers
,您可以使用用户本身的id
值。在id
表上不需要userid
和delusers
。
然后,您可以在INSERT
上delusers
和DELETE
上users
(当然,在同一事务中):
BEGIN;
INSERT INTO delusers(id,lang,email)
SELECT id,lang,email FROM users WHERE id = 20;
DELETE FROM users WHERE id = 20;
COMMIT;
您也可以在同一个命令(使用CTE)上执行此操作:
WITH deleted AS (
DELETE FROM users WHERE id = 20 RETURNING id, lang, email
)
INSERT INTO delusers(id,lang,email)
SELECT id,lang,email FROM deleted;
最后一个是好的,原因如下:
如果这就是你要做的,你不需要显式地打开一个交易(尽管这样做不会对打开它造成伤害);
你可以同时删除很多用户;
PostgreSQL不需要为
users
表中的用户多次查找(一个用于SELECT
另一个用于DELETE
)。不过,用游标也可以做到这一点。关于sql - PostgreSQL-复制行并将uid设置为新列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19832523/