2016-06-27 10 views
1

Ich habe diese Tabelle mit den folgenden Spalten:INSERT INTO .. ​​ON DUPLICATE KEY UPDATE mit mehreren Schlüsseln

id 
userid 
app 
field 
value 

Die Spalten „Feld“ und „app“ zusammen sind einzigartig für die „Benutzer-ID“. So hat der Benutzer immer nur eine Zeile, die die gleichen "App" - und "Feld" -Werte zusammen aufweist. Aber sie werden mehr als eine Zeile haben, die nur den Wert "app" oder den Wert "field" gleich haben. Und es wird immer mehrere Zeilen mit der gleichen "Benutzer-ID" geben.

Ich bin nicht sicher, wie ich tun und mehrere Schlüssel einfügen oder aktualisieren kann. Ich kann sie in mysql nicht als eindeutig definieren, da der Wert für andere "userid" -Zeilen oder andere Zeilen mit einem anderen "app" - oder "field" -Wert verwendet werden kann.

Ist dies möglich oder muss ich zuerst eine SELECT durchführen, um zu prüfen, ob eine Zeile existiert, in der "userid", "app" und "field" übereinstimmen mit dem, was ich einfügen oder aktualisieren möchte.

Auch ich versuche, mehr als 1 Zeile mit einer einzigen Abfrage einzufügen/zu aktualisieren.

+3

kippe Sie erstellen (Benutzer-ID, app, Feld) als einzigartige –

+0

Der Zweck tun der eindeutigen Einschränkung ist so, dass MySQL alle Einsätze zurückweist, die es verletzen. –

+0

In Kürze .... Ich möchte eine Zeile mit den Spalten "userid", "app" und "field" einfügen, aber wenn es bereits eine Zeile mit diesen 3 hat den gleichen Wert dann wird es diese Zeile aktualisieren. Wenn eine dieser Zeilen jetzt andere Zeilen-Maches unterscheidet, wird sie eingefügt. – PixelPaul

Antwort

1

Dies ist, was für mich gearbeitet ...

INSERT INTO table (field, app, userid, value) 
      VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4) 
      ON DUPLICATE KEY UPDATE value=VALUES(value); 

das funktioniert mehrere Zeilen mit einer einzigen Abfrage

+0

_And_ haben diesen 3-Spalten 'UNIQUE' Schlüssel. –

0

können Sie tun, um diese

update mytable set col1 = @value where (field = @v and [email protected]) 

, wenn Sie die drei Felder dann wollen:

update mytable set col1 = @value where (field = @v and [email protected] and userid = @v2) 

Sie sollten sicherstellen, dass die Felder benötigt werden, verbunden mit ‚und‘ und alle sind in Klammern

+0

Entschuldigung, wie fügt dies die Zeile ein, wenn sie noch nicht existiert? – PixelPaul

+0

dies für update..zum Einfügen sollten Sie wählen: Wählen Sie * aus meiner Tabelle where (field = @v und app = @ v1 und userid = @ v2) .. Wenn es ein Ergebnis zurückgegeben wird dann aktualisieren mit was ich in der Antwort geschrieben ..sonst einfügen normal wie ur sicher jetzt, dass dies eine neue Daten ist –

3

Erstellen Sie zunächst einen eindeutigen Index für (user_id, app, field).

ALTER TABLE user_settings 
ADD UNIQUE (userid,app,field); 

dann verwenden Sie eine Abfrage wie diese.

INSERT INTO user_settings SET 
     -- id = ?, Do not include this -- you don't have the value 
     userid = ?, 
     app=?, 
     field=?, 
     value = ?, 
     ON DUPLICATE KEY UPDATE 
     value = ?; 
+0

Ich habe die neue Unique mit 3 Spalten erstellt, ich habe gerade versucht, aber es hat keine neue erstellt, aktualisiert es mit einer anderen Benutzer-ID INSERT INTO user_settings (Feld, app, userid, value) VALUES ('approvaldefaultyes', 'apdible_servicebar', 1 '1'), ('emailcustomerdefaultyes', 'apdible_servicebar', 1 '1') \t \t \t \t ON KEY UPDATE DUPLICATE \t \t \t Wert = Werte (Wert) – PixelPaul

+0

versuchen Sie es mit oben genannten Abfrage in Antwort (ersetzen Sie Fragezeichen mit Ihren Werten) –

+0

Entschuldigung falsch eingefügt, das ist die, aber ich bin nicht sicher, ob es funktioniert, wenn ID o mehrere SET (wenn das möglich ist?) ... INSERT INTO user_settings SET (Feld = 'approveddefaultyes', app = 'apdible_servicebar', Benutzer-ID = 1, Wert = '1'), (field = 'emailcustomerdefaultyes', app = 'apdible_servicebar', Benutzer-ID = 1, Wert = '1') \t \t \t \t ON DUPLICATE KEY UPDATE \t \t \t \t Wert = valuedead – PixelPaul

Verwandte Themen