sql - Postgresql - 复制行并将 uid 设置为新列

标签 sql postgresql copy duplicates

我正在开发用户管理系统,我需要在删除用户之前将用户复制到“备份”表。如何将 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

然后,您可以在 delusersINSERT 和在 usersDELETE(在同一事务中,类(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;

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

  1. 如果这就是您要执行的全部操作,则无需显式打开交易(尽管打开交易也无妨);
  2. 您可以同时删除大量用户;
  3. PostgreSQL 不需要多次在users 表中查找用户(一次用于SELECT,另一次用于DELETE)。不过,使用游标也可以实现同样的效果。

关于sql - Postgresql - 复制行并将 uid 设置为新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19832523/

相关文章:

postgresql - 使用 psql 登录

ruby-on-rails - 设计用户的 rails pg db 迁移未定义方法 `database_authenticatable'

postgresql - 级联复制/插入

mysql - 将表中的一行复制到另一行并在同一查询中插入一列的值

sql - 按给定 ID 列表的顺序按主键从表中检索行?

mysql - Flask-SQLAlchemy 查询成本 - Unicode 转换

java - 如何为PreparedStatements改写SQL语句?

copy - 如何从 NSTableView 复制行

mysql - SQL 查询中的正则表达式问题

sql - 如何自动终止事件 session ?