Sqlite Unique Fehler ignorieren
Mike
- php
0 Peter Lüstig0 Mike0 Peter Lüstig0 Mike
0 Rouven
Hi,
Wenn ich mehrere inserts hintereinander absetze und in diesen Daten ein Doppler ist, bricht die komplette Prozedur ab. Kann ich das irgendwie abstellen ohne vorher aufwendig anzufragen, also so das die Inserts zwar das Uniquefeld auslassen aber doch die weiteren inserts ausgeführt werden?
Bsp.
insert into tbl(a,b,c)values('1','2','3'); // wird ausgeführt
insert into tbl(a,b,c)values('4','5','6'); // wird ausgeführt
insert into tbl(a,b,c)values('7','2','9'); // wird nicht ausgeführt, weil b unique
insert into tbl(a,b,c)values('10','12','13'); // wird auch nicht ausgeführt weil vorher Fehler
Alle Inserts werden natürlich mit einem einzigen sqlite_query() abgesetzt.
Nacheinander würde es klappen aber das wäre ja nicht der Sinn des Ganzen.
Mike
Morgen,
ich bin mir jetzt nicht sicher, aber können Unique-Felder ausgelassen werden, sind es nicht PrimaryKeys?
Was mir so sponntan einfällt ist "IS NOT", vielleicht prüfst du ob der Wert schon vorhanden ist.
Hi,
ich bin mir jetzt nicht sicher, aber können Unique-Felder ausgelassen werden, sind es nicht PrimaryKeys?
Nein ;-) unique kannst du auf alle Felder anwenden. bedeutet nichts anderes, als das der Inhalt nicht noch einmal in der gleichen Spalte vorkommen darf.
Was mir so sponntan einfällt ist "IS NOT", vielleicht prüfst du ob der Wert schon vorhanden ist.
Wie genau meinst du das? Beispiel?
Mike
Nein ;-) unique kannst du auf alle Felder anwenden. bedeutet nichts anderes, als das der Inhalt nicht noch einmal in der gleichen Spalte vorkommen darf.
Ok, sorry.
Was mir so sponntan einfällt ist "IS NOT", vielleicht prüfst du ob der Wert schon vorhanden ist.
Ist schon lage her das ich SQL gemacht habe.
Du prüfst ob ein Wert (in deinem Bsp. die 2) schon vorhanden ist, mit INSERT INTO table_name (a,b,c) VALUES (1,2,3) IS NOT IN (SELECT b FROM table_name);
Also so habe ich das noch in Erinnerung (Syntax zu 99,9% falsch), aber vielleicht hannst du davon was ableiten ...
Hi,
Was mir so sponntan einfällt ist "IS NOT", vielleicht prüfst du ob der Wert schon vorhanden ist.
zu "IS NOT" finde ich jetzt auf die schnelle leider nichts, weil es eben Sucmaschinen-un-taugliche Worte sind. Aber das es natürlich Möglichkeiten gibt das vorher anzufragen, ist klar. Nur befürchte ich, dass ich dann kotraproduktiv arbeite. Der Grund alles in einen Query zu packen ist die Performanceverbesserung. Wenn ich nun jeden Insert zusätzlich mit Abfragen füttere, kann ich wahrscheinlich gleich wieder jeden Insert einzeln absetzen, vermute ich.
Also so habe ich das noch in Erinnerung (Syntax zu 99,9% falsch), aber vielleicht hannst du davon was ableiten ...
Leider nein.
Gruss
Mike
Hello,
in MySQL heißt die Erweiterung des INSERT-Statements "ON DUPLICATE KEY UPDATE". Offenbar unterstützt SQL-Lite eine entsprechende Option für das Create des Tables: id PRIMARY KEY ON CONFLICT [IGNORE|REPLACE]
Ich würde dann zur Replace, Variante tendieren, aber das musst du entscheiden.
MfG
Rouven
Hi Rouven,
...Create des Tables: id PRIMARY KEY ON CONFLICT [IGNORE|REPLACE]
danke für den Hinweis, kannte ich noch nicht.
Ich würde dann zur Replace, Variante tendieren, aber das musst du entscheiden.
Replace kann ich nicht nutzen weil ich dann den alten Eintrag verlieren würde. Also bliebe IGNORE.
Da ich flexibel bleiben will habe ich mich für die insert variante entschieden, anstatt dem Feld das Attribut global mitzugeben.
also "insert OR IGNORE into ......"
Und, was soll ich sagen, scheint perfekt zu klappen, danke.
Da du dich auszukennen scheinst, fällt dir dazu auch etwas ein?
Gruss
Mike