2

我有两张桌子,布局如下......

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

history表包含 所在的master_idNULL。我复制到master表中的那些。

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

如何使用表中关联对象的 更新master_idhistoryidmaster?此更新应与插入操作在同一步骤中进行。如果感兴趣,我会使用 MySQL。

4

2 回答 2

1

master可以根据来自另一个表的某些信息将具有 ID 的表记录插​​入到表中。

例如,您可以使用 histories.id + last 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,则此方法有效。

如果您想使用一些不确定的 ID,例如 UUID,则该解决方案将需要更多步骤:

  • 向表中添加一个临时列histories
  • 填写新的 ID(update histories set tmp_uuid = UUID()类似的东西)。
  • 插入从...中master选择tmp_uuidhistories
  • 更新histories
  • 删除临时列。

使用 UUID 的一个优点是您不需要锁定表。您无需担心其他会话插入记录并获取您的 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;

虽然我不是 100% 的语法,因为我没有可以运行它的 SQL 实例。

于 2013-08-08T16:00:48.693 回答