我在一个用户管理系统上工作,我需要在用户被删除之前将其复制到一个“备份”表中。当两个表上的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表上不需要useriddelusers
然后,您可以在INSERTdelusersDELETEusers(当然,在同一事务中):

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/

10-12 05:44