【问题标题】:Fastest way to insert into link table插入链接表的最快方法
【发布时间】:2016-04-22 21:50:58
【问题描述】:

我想将INSERT 两个表中的ID 转换成一个链接表来解决多对多关系。

在不从两个表中创建复杂的JOIN 的情况下,最快、最有效的INSERT 方法是什么?我需要它只在它不会创建重复项时才插入。

我读到MERGE 可能有效,但看起来您只能使用 1 个源表。

我有两个通过链接表连接的表。架构如下:

CREATE TABLE table1
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 VARCHAR(40))

CREATE TABLE table2
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 VARCHAR(100),
field2 INT,
field3 VARCHAR(40))

CREATE TABLE linkTable
(id INT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
field1 INT REFERENCES table1(id),
field2 INT REFERENCES table2(id))

我在 table1.field1 和 table2.field1 上有一个索引。

【问题讨论】:

  • 如果您在链接表上放置唯一索引,它将拒绝重复项,但您可以捕获并丢弃异常。
  • 嗨@Bryan。我尝试了这种方法,但是在执行批量插入时,如果引发任何异常,它会忘记要插入的其余记录。

标签: java sql database insert derby


【解决方案1】:

可能您正在寻找联合和独特的:

INSERT IGNORE INTO tabc (id)
SELECT id 
FROM (
  SELECT DISTINCT id FROM taba 
  UNION
  SELECT DISTINCT id FROM tabb ) x

或者:

INSERT INTO tabc (id)
SELECT id 
FROM (
  SELECT DISTINCT id FROM taba 
  UNION
  SELECT DISTINCT id FROM tabb ) x
WHERE NOT EXISTS(SELECT 1 FROM tabc WHERE id = x.id)

如果表 taba 和 tabb 有很多行(并且只会插入其中的一部分),那么插入单独过滤的行可能更理想:

INSERT INTO tabc (id)
SELECT id 
FROM (
  SELECT DISTINCT id FROM taba a
  WHERE NOT EXISTS(SELECT 1 FROM tabc WHERE id = a.id)
  UNION
  SELECT DISTINCT id FROM tabb b
  WHERE NOT EXISTS(SELECT 1 FROM tabc WHERE id = b.id)) x

如果您总是在插入 taba 或 tabb 之后将行插入 tabc,那么也许您在插入 taba 和 tabb 之后构建触发器?

在 Apache Derby 中,您可以使用 MERGE,但需要两个命令:

MERGE INTO tabc c
USING taba a
ON a.id = c.id
WHEN NOT MATCHED THEN INSERT (id) VALUES (a.id);

MERGE INTO tabc c
USING tabb b
ON b.id = c.id
WHEN NOT MATCHED THEN INSERT (id) VALUES (b.id);

【讨论】:

  • DISTINCTSELECT 来说不贵吗?我希望增量插入,而不是在其他两个填充后插入。
  • 如果你在 id 上有索引,那么它会很快,如果 id 在 taba 和 tabb 中是唯一的,那么你就不需要它。你用的女巫数据库管理系统?
  • 我正在使用 Apache Derby。 INSERT IGNORE 将解决我所有的问题,但不幸的是它不适用于 Derby!我的问题是,当我插入链接表时,即使有索引,插入时间也会随着表的大小而增长。
  • 发布带有索引的表的定义。
  • 感谢您的帮助@Adam!我已按要求更新了我的帖子。
猜你喜欢
  • 1970-01-01
  • 2012-01-31
  • 2015-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多