插入链接表的最快方法

时间:2016-04-22 21:50:59

标签: java sql database insert derby

我希望INSERT将两个表中的ID转换为链接表以解决多对多关系。

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

我已经读过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上有一个索引。

1 个答案:

答案 0 :(得分:0)

可能你正在寻找工会并且截然不同:

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);