我有两个具有以下布局的表 ...
------------- -------------------------
| Master | | History |
------------- -------------------------
| id | name | | id | name | master_id |
------------- -------------------------
history
表包含 master_id
为 NULL
的行。我将那些复制到 master
表中。
INSERT master (name)
SELECT name
FROM histories h
WHERE h.master_id = NULL
如何使用 master
中关联对象的 id
更新 history
表中的 master_id
> 表?此更新应在插入时发生在同一步骤中。如果对此感兴趣,我会使用 MySQL。
最佳答案
可以根据其他表中的某些信息,将带有 ID 的记录插入到 master
表中。
例如,您可以使用 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(
更新历史设置 tmp_uuid = UUID()
,诸如此类)。 - 插入
master
从histories
中选择tmp_uuid
... - 更新
历史
- 删除临时列。
使用 UUID 的一个优点是您不需要锁定表。您无需担心其他 session 插入记录并获取您的 ID,因为其他 session 会生成不同的 ID。
关于mysql - 如何在插入行时更新外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130581/