ich habe mal eine grundsätzliche Frage zu "[SIZE=3]ON DUPLICATE KEY UPDATE"[/SIZE]
Ich hätte da eine Tabelle mit 3 Spalten, ID, userID, status_value.
Im Prinzip ist es ja ganz einfach:
Jeder Nutzer kann genau einen Status angeben.
Hat ein Nutzer bereits einen Status, kann er diesen ändern.
Genau dafür ist „ON DUPLICATE KEY UPDATE“ ja gemacht.
Wenn ich mir aber alle Beispiele und Tutorials durchlesen, erfolgt die Neuzuordnung ja immer durch UPDATE table set c=c+1.
Was ist aber, wenn die oben genannte ID unique ist und automatisch weitergezählt werden soll? Wie gibt man dass dann an?
Die Status-Spalte dürfte nicht zu den Schlüsselspalten zählen. Wenn ID und userID zusammen der Primärschlüssel sind sollte es eigentlich klappen die Status-Spalte zu erneuern.
Ich korrigiere, ich habe 4 Spalten:
ID, userID, groupID, status_value
Zu den Schlüsselspalten gehören userID und groupID - also die Kombination eines Users mit einer Gruppe darf nur einmal vorkommen.
[CODE]INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
UPDATE table SET c=c+1 WHERE a=1;[/CODE]
Also es geht jetzt ums Verständnis.
Gemäß dem Code passiert folgendes:
neuer Eintrag mit a=1,b=2,c=3 AUSSER wenn a=1 bereits vorhanden, dann wird diesem Eintrag mit a=1 ein neuer C-Wert mit c=c+1 zugeordnet.
Ist das so richtig?
Und wenn ich nach a=1 UND b=2 suche, dann muss das sicherlich so aussehen, oder?
WHERE a=1 AND b=2
Nicht zwangsläufig. Weil das einzelne Statement nicht enzigartig ist, sondern mehrfach vorkommt - ein Benutzer kann ja in mehreren Gruppen sein.
Selbiges gilt auch umgedreht, in einer Gruppe können mehrere Benutzer sein.
Ergo: nur die Kombination Nutzer + Gruppe ist einzigartig und daher muss ich beides gleichzeitig abfragen.
Aber jetzt erstmal zur Kernfrage:
Hab ich den Code nun richtig verstanden???
Das hier klappt irgendwie nicht:
[PHP]
„INSERT INTO childrens
(group_ID, user_ID, numberofchild)
VALUES (‚$group_ID‘,‚$user_ID‘, '$numberofchild ');
ON DUPLICATE KEY UPDATE numberofchild =$numberofchild;
UPDATE childrens SET numberofchild =$numberofchild WHERE group_ID=$group_ID AND user_ID=$user_ID“;
[/PHP]
Ist REPLACE() vielleicht besser für mein Vorhaben geeignet?
Wenn Du das so abschickst erhältst Du logischerweise einen Fehler. Ich hoffe Du hast auch eine Fehlerverarbeitung eingebaut - denn das sollte es ergeben.
Fehler 1:
Hinter den VALUES ist ein „;“ wodurch der INSERT-Statement beendet wird. Das ON DUPLICATE gehört aber dazu - d.h. du müsstest das „;“ hier weglassen.
Fehler 2:
Du führst nach dem INSERT … UPDATE noch ein weiteres UPDATE aus, was aber völlig unnötig ist. INSERT … UPDATE macht ja bereits ein UPDATE wenn die Primärschlüssel übereinstimmen (daher „ON DUPLICATE KEY“). Du hast es also eindeutig noch nicht verstanden.
Ich denke REPLACE wäre für dich tatsächlich die bessere Variante, da Du das einfacher verstehen kannst.
Und denk auch an eine Verarbeitung von möglichen SQL-Fehlern - dann wäre dir der o.g. Irrtum schon vorgestern aufgefallen