Es fällt mir schwer, ein bedingtes INSERT zu bilden
Ich habe x_table mit Spalten (Instanz, Benutzer, Element), in denen die Instanz-ID eindeutig ist. Ich möchte nur dann eine neue Zeile einfügen, wenn der Benutzer bereits kein bestimmtes Element hat.
Zum Beispiel versuchen, Instanz = 919191 Benutzer = 123 Element = 456 einzufügen
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
Jede Hilfe oder Anleitung in die richtige Richtung wäre sehr dankbar.
quelle
dual
in diesem Fall vorab erstellt werden oder handelt es sich um eine spezielle "temporäre" Tabelle, die von der Abfrage nur für die Verwendung der Abfrage erstellt wurde?dual
, müssen Sie es erstellen.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
SELECT COUNT(*) FROM dual
immer bekommen1
, und wennSELECT 'foo' FROM dual
Sie immer bekommenfoo
. Aber du kannst nichtSELECT * FROM dual
und du kannst nichtDESCRIBE dual
oder so etwas. Ich habe es nicht überprüft, aber ich glaube auch nicht, dass Sie Berechtigungen für widerrufen könnendual
. Es ist also erwähnenswert, dass es so funktioniert, wie Sie es erwarten ... außer wenn es nicht funktioniert;)Sie können auch verwenden, bei
INSERT IGNORE
dem die Einfügung stillschweigend ignoriert wird, anstatt eine Zeile zu aktualisieren oder einzufügen, wenn Sie einen eindeutigen Index für (Benutzer, Element) haben.Die Abfrage sieht folgendermaßen aus:
Sie können den eindeutigen Index mit hinzufügen
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.quelle
Haben Sie jemals so etwas versucht?
quelle
Mit a
UNIQUE(user, item)
, mach:Das
user=123
Bit ist ein "No-Op", das der Syntax derON DUPLICATE
Klausel entspricht, ohne tatsächlich etwas zu tun, wenn Duplikate vorhanden sind.quelle
Falls Sie keine eindeutige Einschränkung festlegen möchten, funktioniert dies wie ein Zauber:
Ich hoffe es hilft !
quelle
Was du willst ist
INSERT INTO table (...) SELECT ... WHERE ...
. aus dem MySQL 5.6 Handbuch .In Ihrem Fall ist es:
Oder weil Sie keine komplizierte Logik verwenden, um zu bestimmen, ob die ausgeführt werden soll
INSERT
oder nicht, können Sie einfach einenUNIQUE
Schlüssel für die Kombination dieser beiden Spalten festlegen und dann verwendenINSERT IGNORE
.quelle
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where...
bekomme immer (läuft 5.6.34)from dual
vorher sagenwhere
.FROM DUAL
ist die Standardeinstellung, wenn keine Tabellen referenziert wurden ( siehe diese Dokumentation ).Wenn Sie eine Einschränkung hinzufügen, die (x_table.user, x_table.item) eindeutig ist, schlägt das Einfügen einer weiteren Zeile mit demselben Benutzer und Element fehl.
z.B:
quelle
Obwohl es gut ist, vor dem Einfügen Ihrer Daten nach Duplikaten zu suchen, empfehle ich Ihnen, Ihren Spalten eine eindeutige Einschränkung / einen eindeutigen Index zuzuweisen, damit keine doppelten Daten versehentlich eingefügt werden können.
quelle
Sie können die folgende Lösung verwenden, um Ihr Problem zu lösen:
quelle
Bei geringfügigen Änderungen an Alex 'Antwort können Sie auch einfach auf den vorhandenen Spaltenwert verweisen:
quelle
Dieser steht also für PostgreSQL
quelle
Die Syntax kann je nach Datenbank variieren ...
quelle