Ich habe mich umgesehen, aber nicht gefunden, ob es möglich ist.
Ich habe diese MySQL-Abfrage:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
Die Feld-ID hat einen "eindeutigen Index", daher können nicht zwei davon vorhanden sein. Wenn dieselbe ID bereits in der Datenbank vorhanden ist, möchte ich sie aktualisieren. Aber muss ich wirklich alle diese Felder noch einmal angeben, wie:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=2,b=3,c=4,d=5,e=6,f=7,g=8
Oder:
INSERT INTO table (id,a,b,c,d,e,f,g) VALUES (1,2,3,4,5,6,7,8)
ON DUPLICATE KEY UPDATE a=VALUES(a),b=VALUES(b),c=VALUES(c),d=VALUES(d),e=VALUES(e),f=VALUES(f),g=VALUES(g)
Ich habe alles schon in der Beilage angegeben ...
Ein zusätzlicher Hinweis, ich möchte die Arbeit nutzen, um die ID zu bekommen!
id=LAST_INSERT_ID(id)
Ich hoffe, jemand kann mir sagen, was der effizienteste Weg ist.
a=VALUES(a), b=VALUES(b), ...
ist der Weg, den Sie gehen müssen. So mache ich das für alle meineINSERT ON DUPLICATE KEY UPDATE
Aussagen.Antworten:
Die
UPDATE
Anweisung wird angegeben, damit ältere Felder auf einen neuen Wert aktualisiert werden können. Wenn Ihre älteren Werte mit Ihren neuen übereinstimmen, warum sollten Sie sie dann auf jeden Fall aktualisieren?Zum Beispiel. Wenn Ihre Spalten
a
zug
bereits eingestellt als2
auf8
; Es wäre nicht erforderlich, es erneut zu aktualisieren.Alternativ können Sie verwenden:
Um das
id
von zu bekommenLAST_INSERT_ID
; Sie müssen die Backend-App angeben, die Sie für dieselbe verwenden.Für LuaSQL ruft a
conn:getlastautoid()
den Wert ab.quelle
tbl
bereits die Zeile (1,10) enthält, setzt:INSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=VALUES(a)
a = 2 . WährendINSERT INTO tbl(id, a) VALUES(1,2) ON DUPLICATE KEY UPDATE a=a
wird ein = 10 setzena=a
Updates nichts. (Die Abfragen in der ursprünglichen Frage aktualisieren auch nichts, aber ein Update scheint das zu sein, was das OP beabsichtigt hat.)Es gibt eine MySQL-spezifische Erweiterung für SQL, die genau das ist, was Sie wollen -
REPLACE INTO
Es funktioniert jedoch nicht ganz so wie 'ON DUPLICATE UPDATE'
Es löscht die alte Zeile, die mit der neuen Zeile kollidiert, und fügt dann die neue Zeile ein. Solange Sie keinen Primärschlüssel in der Tabelle haben, wäre das in Ordnung. Wenn Sie dies jedoch tun, verweist eine andere Tabelle auf diesen Primärschlüssel
Sie können nicht auf die Werte in den alten Zeilen verweisen, daher können Sie kein Äquivalent dazu erstellen
Das sollte funktionieren - last_insert_id () sollte den richtigen Wert haben, solange Ihr Primärschlüssel automatisch inkrementiert wird.
Wie gesagt, wenn Sie diesen Primärschlüssel tatsächlich in anderen Tabellen verwenden,
REPLACE INTO
ist dies für Sie wahrscheinlich nicht akzeptabel, da dadurch die alte Zeile gelöscht wird, die über den eindeutigen Schlüssel in Konflikt geraten ist.Jemand anderes hat vorgeschlagen, bevor Sie die Eingabe reduzieren können, indem Sie Folgendes tun:
quelle
replace into
Abfrage nicht an den Primärschlüssel halten ?Es gibt keinen anderen Weg, ich muss alles zweimal angeben. Erstens für die Einfügung, zweitens für den Update-Fall.
quelle
Hier ist eine Lösung für Ihr Problem:
Ich habe versucht, ein Problem wie das Ihre zu lösen, und ich möchte vorschlagen, es unter einfachen Gesichtspunkten zu testen.
Befolgen Sie diese Schritte: Lernen Sie aus einer einfachen Lösung.
Schritt 1: Erstellen Sie mit dieser SQL-Abfrage ein Tabellenschema :
Schritt 2: Erstellen Sie einen Index aus zwei Spalten , um doppelte Daten mithilfe der folgenden SQL-Abfrage zu vermeiden:
oder Erstellen Sie einen Index mit zwei Spalten über die GUI wie folgt:
Schritt 3: Aktualisieren, falls vorhanden, einfügen, wenn keine der folgenden Abfragen verwendet werden:
quelle
Nur für den Fall, dass Sie eine Skriptsprache zum Vorbereiten Ihrer SQL-Abfragen verwenden können, können Sie Feld-Wert-Paare
SET
anstelle von verwenden(a,b,c) VALUES(a,b,c)
.Ein Beispiel mit PHP:
Beispieltabelle:
quelle
Möglicherweise möchten Sie die Verwendung der
REPLACE INTO
Syntax in Betracht ziehen , aber seien Sie gewarnt, wenn Sie den PRIMARY / UNIQUE-Schlüssel duplizieren, wird die Zeile gelöscht und eine neue eingefügt .Sie müssen nicht alle Felder neu angeben. Sie sollten jedoch die mögliche Leistungsreduzierung in Betracht ziehen (abhängig von Ihrem Tischdesign).
Vorsichtsmaßnahmen:
quelle
Ich weiß, dass es spät ist, aber ich hoffe, dass jemandem bei dieser Antwort geholfen wird
Sie können das Tutorial hier lesen:
quelle
new
:INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new ON DUPLICATE KEY UPDATE c = new.a+new.b;
Sie können Insert Ignorieren für einen solchen Fall verwenden. Es wird ignoriert, wenn doppelte Datensätze abgerufen werden. INSERT IGNORE ...; - ohne ON DUPLICATE KEY
quelle