2

次のレイアウトの2つのテーブルがあります...

-------------    -------------------------
| Master    |    | History               |
-------------    -------------------------
| id | name |    | id | name | master_id |
-------------    -------------------------

historyテーブルには、 が である行が含まれていmaster_idますNULLmaster私がテーブルにコピーしたもの。

INSERT master (name)
SELECT name
FROM histories h
WHERE h.master_id = NULL

テーブル内の を、テーブルmaster_id内の関連オブジェクトの で更新するにはどうすればよいですか? この更新は、挿入と同じ手順で行う必要があります。これが興味がある場合は、MySQL を使用します。historyidmaster

4

2 に答える 2

1

master他のテーブルからの情報に基づいた ID を持つテーブル レコードに挿入することができます。

たとえば、history.id + 最後の master.id を使用できます。

LOCK TABLES master WRITE, histories AS h WRITE;

SELECT id FROM master ORDER BY id DESC LIMIT 1 INTO @last_master_id;

INSERT INTO master (id, name)
    SELECT h.id + @last_master_id, h.name FROM histories h;

UPDATE histories h SET h.master_id = h.id + @last_master_id;

UNLOCK TABLES;

これは、整数 ID を使用し、新しい ID が他の ID に基づいていることを気にしない限り機能します。

UUID などの非決定論的な ID を使用する場合、ソリューションにはさらにいくつかの手順が必要になります。

  • テーブルに一時列を追加しhistoriesます。
  • 新しい ID (update histories set tmp_uuid = UUID()など) を入力します。
  • master選択範囲tmp_uuidに挿入histories...
  • アップデートhistories
  • 一時列をドロップします。

UUID を使用する利点の 1 つは、テーブルをロックする必要がないことです。他のセッションは別の ID を生成するため、他のセッションがレコードを挿入して ID を取得することを心配する必要はありません。

于 2017-01-01T15:03:00.823 に答える
0

ここの SQL ドキュメント: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

次のようなことができるはずです。

INSERT master (name)
SELECT name, id
FROM history h
WHERE h.master_id = NULL

UPDATE History SET master_id = LAST_INSERT_ID() 
WHERE History.id = h.id;

私はこれに対して実行できる SQL インスタンスを持っていないため、構文については 100% ではありません。

于 2013-08-08T16:00:48.693 に答える