1

我正在开发用户管理系统,我需要在删除用户之前将用户复制到“备份”表中。如何在两个表上都是唯一的时将其设置id为新列?useridid

用户

+----+------+-------------+--+
| id | lang |    email    |  |
+----+------+-------------+--+
| 20 | en   | test@ya.hoo |  |
+----+------+-------------+--+

妄想者

+----+--------+------+-------------+
| id | userid | lang |    email    |
+----+--------+------+-------------+
|  1 |     20 | en   | test@ya.hoo |
+----+--------+------+-------------+
4

1 回答 1

1

首先,如果一个用户不能被删除两次,那delusers.id可能是PRIMARY KEYdelusers的,你可以使用id用户本身的值。没有必要id useriddelusers桌子上。

然后,您可以INSERT继续(当然是在delusers同一个事务中):DELETEusers

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;

由于某些原因,最后一个很好:

  1. 如果这就是你要做的所有事情,你不需要显式地打开一个事务(虽然打开它并没有什么害处);
  2. 您可以同时删除大量用户;
  3. PostgreSQL 不需要users多次查找表中的用户(一个 forSELECT和另一个 for DELETE)。不过,游标也可以实现同样的效果。
于 2013-11-07T12:35:59.073 回答