我们正在从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_temp
和child_temp
,我想将记录插入父表和子表。问题是我需要跟踪parent_id
自动生成的parent_temp_id
列。在SQL Server中,我们使用Output into
语句来解决此问题。由于这里没有直接的方法,这里有一些我能想到的直接解决方案:
在父表中添加备用列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
方法1和方法2的问题在于它们对于批量插入来说很慢。我们可以一次轻松插入15k行。如果两个或多个用户同时运行相同的插入查询,并且如果他们的parent_temp_id
匹配(我们正在使用int
,并且它们将始终从1开始,则方法3将会出现问题2,3,4 ...)。如果我们使用GUID
而不是int
s,我们可以避免这个重复的问题。但是我们总是需要在这些表中创建额外的列,并确保它们不用于其他目的。
根据上述情况,还有其他MySQL解决方案吗?你更喜欢哪一个?