1

ユーザー管理システムに取り組んでおり、ユーザーを削除する前に、ユーザーを「バックアップ」テーブルにコピーする必要があります。両方のテーブルで一意であるときにid新しい列useridに設定するにはどうすればよいですか?id

ユーザー

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

怠け者

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

1 に答える 1

1

まず、ユーザーを 2 回削除できない場合、はテーブルの可能性があり、ユーザー自体の の値を使用できdelusers.idます。との必要はありませPRIMARY KEYdelusersidid useriddelusers

その後、次のことができます(もちろん、同じトランザクション内INSERTで):delusersDELETEusers

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複数回検索する必要はありません (1 つは でSELECT、もう 1 つは ですDELETE)。ただし、カーソルを使用しても同じことが実現できます。
于 2013-11-07T12:35:59.073 に答える