mysql - 如何在插入行时更新外键?

标签 mysql sql foreign-keys sql-insert

我有两个具有以下布局的表 ...

-------------    -------------------------
| 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 中关联对象的 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(),诸如此类)。
  • 插入masterhistories中选择tmp_uuid...
  • 更新历史
  • 删除临时列。

使用 UUID 的一个优点是您不需要锁定表。您无需担心其他 session 插入记录并获取您的 ID,因为其他 session 会生成不同的 ID。

关于mysql - 如何在插入行时更新外键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130581/

相关文章:

php - MySql,如何从不同用户获取最后一条消息

mysql - 自连接表以获取 2 列的所有组合的值

mysql - 通过 Java 从 iOS 应用程序将表情符号字符插入 MySQL DB

mysql - 如何自动增加一个值

sql - 普通表表达式,遍历图时如何避免无限递归?

sql - 尝试使用循环将多个值存储到变量中,并使用该特定变量进行插入

android - 什么时候查询在Android上返回Null?

mysql - 为所有具有相同列名的表添加外键

c# - 属性 'Id'是对象关键信息的一部分,不可修改

mysql - 在外键列上插入问题