我正在开发用户管理系统,我需要在删除用户之前将用户复制到“备份”表。如何将 id
设置为新列 userid
而两个表上的 id
都是唯一的?
用户
+----+------+-------------+--+
| id | lang | email | |
+----+------+-------------+--+
| 20 | en | test@ya.hoo | |
+----+------+-------------+--+
欺骗者
+----+--------+------+-------------+
| id | userid | lang | email |
+----+--------+------+-------------+
| 1 | 20 | en | test@ya.hoo |
+----+--------+------+-------------+
最佳答案
首先,如果一个用户不能被删除两次,delusers.id
可以是delusers
表的PRIMARY KEY
,你可以使用用户本身的 id
的值。 delusers
表上不需要id
和 userid
。
然后,您可以在 delusers
上INSERT
和在 users
上DELETE
(在同一事务中,类(class)):
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/