我们正在从 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
语句来解决此问题。由于这里没有可用的直接方法,因此我可以想到一些直接的解决方案:
- 通过实体框架进行插入。
- 使用 while 循环迭代父记录并在父表中插入,获取自动生成的键并插入到子表中。等等。
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
的 's 匹配因为(我们使用的是int
,并且他们总是从 1、2、3、4 开始......),则方法 3 将出现问题。如果我们使用GUID
s 而不是int
s,我们可能可以避免这个重复的问题。但是我们总是需要在这些表中创建额外的列,并确保它们不会用于其他目的。
基于以上场景,MySQL还有其他解决方案吗?你更喜欢哪一个?