2016-09-05 4 views
0

Diese Frage ist sehr einfach, aber ich habe noch keine Antwort gefunden, durch die Suche nach "UPDATE JOIN INSERT" und andere Sachen wie diese.UPDATE JOIN -> EINFÜGEN AUF NULL

Ich brauche ein UPDATE für zwei Tabellen ('main' und 'sub'), während eine Datenmenge möglicherweise nicht existiert. dann sollte ein einfacher INSERT vor ... in einer Anweisung ausgeführt werden.

"Haupt" immer vorhanden.
'sub' nicht.

Meine verträumt-SQL-Lösung ist diese:

UPDATE main LEFT JOIN sub on main.primary=sub.primary 
SET main.foo='bar', sub.foo2='bar2' 
CASE sub.primary IS NULL {INSERT INTO sub SET sub.primary=main.primary}; 

Der ‚Case'-Teil ist Freestyle und wird vermutlich nicht funktionieren. Aber was ist der richtige Weg?

Es muss unbedingt ein "UPDATE [...] LINKE VERBINDUNG [...] SET a = aVal, b = bVal, [...]" - Anweisung sein. Es muss erweiterbar sein für bis zu 5 LINKE JOIN-Tabellen und funktioniert ohne "SET (..) WERTE (..)"

Gibt es eine mögliche Lösung?

+0

die Logik umkehren, und um, dass Google stattdessen – Strawberry

+3

INSERT INTO Tabelle ... ON DUPLICATE KEY UPDATE ... – Mike

+0

Gibt es einen Grund 'Es muss unbedingt ein" UPDATE [...] LINKE VERBINDUNG [...] SET a = aVal, b = bVal, [...] "- Erklärung? – Pachonk

Antwort

1

Eine UPDATE-Anweisung kann vorhandene Zeilen ändern. In kann keine neuen Zeilen hinzufügen. Absolut.

Eine INSERT-Anweisung kann zum Hinzufügen von Zeilen zu einer Tabelle verwendet werden. Es ist definitiv möglich, eine Anweisung zu schreiben, die die "fehlenden" Zeilen hinzufügt.

Aber wenn es "unbedingt eine UPDATE" -Anweisung sein muss, um Zeilen hinzuzufügen, dann gibt es keine Lösung.

+0

Ich dachte über eine INSERT und eine UPDATE-Anweisung in einer Anweisung ausgeführt. Es ist möglich Subselects in Anweisungen zu verwenden. Ist das nicht immer noch eine Aussage? – Charliexyx

+0

Es ist möglich, eine INSERT-Anweisung im Kontext eines Triggers auf einem UPDATE auszuführen; Wir können einen Trigger definieren, der z. B. Zeilen zu einer Audit-Tabelle hinzufügt, wenn eine Zeile aktualisiert wird. (Beachten Sie, dass es immer noch eine INSERT-Anweisung ist, die die Zeilen einfügt, obwohl dies durch die Ausführung einer UPDATE-Anweisung ausgelöst wurde.) Ich glaube jedoch nicht, dass es möglich ist, Zeilen in dieselbe Tabelle einzufügen, auf die in einer UPDATE-Anweisung verwiesen wird. Ich denke, das ist eine Einschränkung.Und selbst wenn das möglich wäre, wäre es immer noch eine INSERT-Anweisung, die die Zeilen und nicht die UPDATE-Anweisung hinzufügt. – spencer7593

+0

Klingt wie eine großartige Lösung, wenn es auf dem gleichen Tisch funktioniert. Leider sind Trigger nicht erlaubt, weil es alles zu komplex macht. (Keine MySQL-Logik. Jede Logik muss in der Anweisung zur einfacheren Wartung sichtbar sein.) – Charliexyx

3

ON DUPLICATE KEY ist wahrscheinlich Ihre beste Wette.
Etwas um die Linien von:

INSERT INTO sub s (col1, col2, col3) 
SELECT m.col1, m.col2, m.col3 
FROM MAIN m 
ON DUPLICATE KEY 
UPDATE SET m.foo='bar', s.foo2='bar2' 

Wenn Sie im Rahmen Ihrer Join-Abfrage nach links müssen, einfach in der wie so wählen Sie hinzufügen:

INSERT INTO sub s (col1, col2, col3) 
SELECT m.col1, m.col2, m.col3 
FROM MAIN m 
LEFT JOIN sub s ON s.primary = m.primary 
LEFT JOIN sub2 s2 ON s2.primary = m.primary 
ON DUPLICATE KEY 
UPDATE SET m.foo='bar', s.foo2='bar2', s.foobar = s2.foobar 
+0

OP sagte, dass "es absolut eine" UPDATE ... LEFT JOIN ... "- Anweisung sein muss. Und das ist eindeutig * nicht * ein UPDATE - Anweisung Dies ist ein Beispiel für eine INSERT - Anweisung – spencer7593

+0

@ spencer7593 Obwohl sie angegeben haben, dass die endgültige Antwort ein Update sein soll, dachte ich, dass es sich lohnt, diese Antwort zu veröffentlichen, da es die beste Lösung für das Problem ist OP wird derzeit konfrontiert – Pachonk

+0

Wird diese Lösung immer noch funktionieren, wenn es nicht nur eine LINKE VERBINDUNG, sondern 5 LINKE VERBINDUNGEN ist? – Charliexyx