2016-04-22 9 views
0

Ich möchte INSERT die IDs aus zwei Tabellen in eine Verknüpfungstabelle, um eine viele zu viele Beziehung aufzulösen.Schnellste Weg zum Einfügen in Verknüpfungstabelle

Was ist der schnellste und effizienteste Weg zu INSERT ohne einen komplexen JOIN aus zwei Tabellen zu machen? Ich brauche es nur einzufügen, wenn es auch keine Duplikate erzeugt.

Ich habe gelesen, dass MERGE kann effektiv sein, aber sieht aus wie Sie nur 1 Quellentabelle verwenden können.

Ich habe zwei Tabellen durch eine Verknüpfungstabelle verbunden. Das Schema ist unten:

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

ich einen Index für table1.field1 und table2.field1 haben.

+0

Wenn Sie einen eindeutigen Index für die Link-Tabelle platzieren, wird es die Duplikate mit einer Ausnahme verweigern, die Sie fangen und entsorgen können. –

+0

Hallo @ Bryan. Ich habe diesen Ansatz ausprobiert, aber beim Ausführen von Batch-Einfügungen vergisst er, wenn eine Ausnahme ausgelöst wird, den Rest der einzufügenden Datensätze. –

Antwort

0

wahrscheinlich der Suche nach Vereinigung und deutlich:

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

Oder:

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) 

Wenn Tabellen taba und tabb haben viele Zeilen (und ein Teil davon nur eingefügt wird), dann vielleicht mehr Optimal sind die separat zu filternden Zeilen:

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 

Wenn Sie Zeilen immer in Tabc afte einfügen r in Taba oder Tabb einfügen, dann vielleicht Trigger nach dem Einfügen auf Taba und Tabb?

In Apache Derby Sie MERGE verwenden können, müssen aber zwei Befehle:

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

Ist 'DISTINCT' teuer für' SELECT'? Und ich suche, inkrementell einzufügen, anstatt sobald die anderen zwei besetzt sind. –

+0

Wenn Sie Indizes für ID haben, dann wird es schnell, wenn ID in Tab und Tabb eindeutig ist, dann brauchen Sie es nicht. Witch DBMS benutzt du? –

+0

Ich benutze Apache Derby. INSERT IGNORE würde alle meine Probleme lösen, aber leider ist es nicht für Derby verfügbar! Mein Problem ist, dass, wenn ich in die Link-Tabelle selbst mit einem Index einfüge, die Einfügezeit mit der Größe der Tabelle wächst. –

Verwandte Themen