MySQL批量插入:父表自动生成密钥到子表

时间:2015-10-05 11:05:16

标签: mysql database parent-child autogeneratecolumn

我们正在从SQL Server 2012迁移到MySQL 5.6。出现的一种情况是在父子表中插入批量记录。一个例子:

create table parent (
parent_id int primary key auto_increment,
parent_name varchar(100) );

create table child (
child_id int primary key auto_increment,
child_name varchar(100) ,
foreign key (parent_id) references parent(parent_id));

假设我有两个临时表parent_tempchild_temp,我想将记录插入父表和子表。问题是我需要跟踪parent_id自动生成的parent_temp_id列。在SQL Server中,我们使用Output into语句来解决此问题。由于这里没有直接的方法,这里有一些我能想到的直接解决方案:

  1. 通过实体框架进行插入。
  2. 使用while循环迭代父记录并在父表中执行插入,获取自动生成的密钥并插入子表。等等。
  3. 在父表中添加备用列dummy_col以保存映射。这将允许父表的批量插入。插入查询看起来像

    insert into parent(parent_name,dummy_col ) select parent_temp_name, parent_temp_id from parent_temp

    通过这种方式,我们将在parent和parent_temp表的行之间进行1-1映射。子表查询看起来像

    insert into child(child_name,parent_id) select child_temp_name, p.parent_id from child_temp ct inner join parent p on p.dummy_col = ct.parent_temp_id

  4. 方法1和方法2的问题在于它们对于批量插入来说很慢。我们可以一次轻松插入15k行。如果两个或多个用户同时运行相同的插入查询,并且如果他们的parent_temp_id匹配(我们正在使用int,并且它们将始终从1开始,则方法3将会出现问题2,3,4 ...)。如果我们使用GUID而不是int s,我们可以避免这个重复的问题。但是我们总是需要在这些表中创建额外的列,并确保它们不用于其他目的。

    根据上述情况,还有其他MySQL解决方案吗?你更喜欢哪一个?

0 个答案:

没有答案