4

我们正在从 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

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

基于以上场景,MySQL还有其他解决方案吗?你更喜欢哪一个?

4

0 回答 0