SQL insert on duplicate key update - passend für mein Vorhaben?

meaculpa

Newbie
Registriert
Mai 2010
Beiträge
2
Hallo!

Ich habe in einer MySQL-Tabelle Datensätze mit userid, articleid, content und noch ein paar anderen Attributen.

Es soll nun immer dann ein neuer Datensatz angelegt werden, wenn es in der gesamten Datenbank die Kombination aus userid und articleid nicht schon gibt.

Wenn also eine Zeile aus userid:501, articleid:874 existiert und ein neues Query mit den selben ids hereinkommt, so soll der bereits existierende Satz geupdatet werden - gibt es die Kombination nicht, so soll ein insert getätigt werden.

Wichtig: es geht nur um die Kombination von beidem. identische uderids und articleids dürfen so oft vorkommen wie sie wollen, aber in Kombination eben nur ein mal.

Wie könnte ich das regeln? Ich habe schon von INSERT ON DUPLICATE KEY UPDATE gehört, weiß aber nicht genau, wie ich vorgehen soll. Normalerweise setzt man das gewünschte Attribut wohl auf UNIQUE wenn man den genannten Befehl einsetzt, aber bei mir geht es ja um die Kombination 2er Attribute.


Danke vielmals!
Ergänzung ()

Habe im MySQL-Forum einen tollen Beitrag gefunden - wen es interessiert, für die Forensuche und Co.:

Please note: "INSERT... ON DUPLICATE KEY UPDATE..." can also use a compound (unique) key to check for duplication. This is very userful. For example:
If you have a log table to log hits to different websites daily, with "site_id"-s and "time" fields, where neither of them are primary keys, but togethether they are unique, then you can create a key on them, and then use "...ON DUPLICATE KEY..."

Table logs:
id: INT(11) auto_increment primary key
site_id: INT(11)
time: DATE
hits: INT(11)

Then:
CREATE UNIQUE INDEX comp ON logs (`site_id`, `time`);

And then you can:
INSERT INTO logs (`site_id`, `time`,`hits`) VALUES (1,"2004-08-09", 15) ON DUPLICATE KEY UPDATE hits=hits+15;

Excellent feature, and it is much faster and briefer then using first a select, then issuing either an update or an insert depending on the value of the select. You also get rid of the probably necessary table-lock during this action.
 
Hallo meaculpa,

konntest du damit Dein Problem lösen? Sieht auf jedenfall so aus, als ob das funktionieren könnte :-) Werde es demnächst mal bei MySQL ausprobierenn - ähnliches Problem hatte ich nämlich auch kürzlich und habe die Überprüfung per Hand gemacht (im Sinne von einer PHP-Funktion die erst schaut ob die Werte schon vorhanden sind. Sehr unschöne und langsame Lösung). Also... Danke Dir! ;-)

Lg, innu
 
Hallo innu,

ja, konnte das Problem damit wirklich lösen. Es ist genau so einfach wie es da steht.

Erst legst du einmalig einen neuen unique index auf deine gewünschte Kombination, z.B.

CREATE UNIQUE INDEX kombination ON table (`id1`, `id2` etc....);

Dein Query sieht dann so aus:

INSERT INTO table ( // deine werte im falle dass es die kombi nicht gibt) VALUES (.....) ON DUPLICATE KEY UPDATE // hier ansonsten dein update
 
Zurück
Oben