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

时间:2013-08-08 15:53:31

标签: 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更新id表中的master?此更新应在插入的同一步骤中进行。如果感兴趣,我会使用MySQL。

2 个答案:

答案 0 :(得分: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_uuid选择histories
  • 更新histories
  • 删除临时列。

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

答案 1 :(得分: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实例,我可以反对。