INSERT..UPDATE..WHERE
Ik wil een key-value combinatie opslaan in de database, en als deze al bestaat hem overschrijven, tenzij de combi in de database nieuwer is dan de combi die ik erin wil zetten.
Dat eerste deel, invoegen en bijwerken als 'ie al bestaat is simpel te doen. Maar bij het bijwerken als 'ie al bestaat alleen als mtime kleiner is dan de nieuwe mtime gaat het wat scheef. Volgens mij kan je namelijk geen WHERE gebruiken in INSERT..UPDATE.
Dus ik heb nu dit, de IF functie gebruikt, maar mooi is anders. Het zou nog mooier zijn als het zo was dat affected_rows() ook nog zou laten zien dat de waarden niet zijn gewijzigd. Als ik nu een combi invoeg die niet overschreven wordt (mtime is kleiner dan bestaande mtime) is affected_rows nog steeds 1.
Dit werkt, maar kan het beter?
(pair_key,origin_id,user_id tesamen is de primary key, mtime is van het type DateTime)
edit: affected_rows werkt wel, maar is altijd 2. Maar dat is niet zo'n probleem. Dus voor mij heeft deze query eigenlijk geen nadelen meer behalve dat 'ie niet echt mooi is.
Dat eerste deel, invoegen en bijwerken als 'ie al bestaat is simpel te doen. Maar bij het bijwerken als 'ie al bestaat alleen als mtime kleiner is dan de nieuwe mtime gaat het wat scheef. Volgens mij kan je namelijk geen WHERE gebruiken in INSERT..UPDATE.
Dus ik heb nu dit, de IF functie gebruikt, maar mooi is anders. Het zou nog mooier zijn als het zo was dat affected_rows() ook nog zou laten zien dat de waarden niet zijn gewijzigd. Als ik nu een combi invoeg die niet overschreven wordt (mtime is kleiner dan bestaande mtime) is affected_rows nog steeds 1.
Dit werkt, maar kan het beter?
Code (php)
1
2
3
4
5
6
2
3
4
5
6
INSERT INTO pairs
(pair_key, pair_value, mtime, origin_id, user_id)
VALUES (:key, :value, :mtime, :origin_id, :user_id)
ON DUPLICATE KEY UPDATE
pair_value = IF(VALUES(mtime) > mtime, VALUES(pair_value), pair_value),
mtime = IF(VALUES(mtime) > mtime, VALUES(mtime), mtime)
(pair_key, pair_value, mtime, origin_id, user_id)
VALUES (:key, :value, :mtime, :origin_id, :user_id)
ON DUPLICATE KEY UPDATE
pair_value = IF(VALUES(mtime) > mtime, VALUES(pair_value), pair_value),
mtime = IF(VALUES(mtime) > mtime, VALUES(mtime), mtime)
(pair_key,origin_id,user_id tesamen is de primary key, mtime is van het type DateTime)
edit: affected_rows werkt wel, maar is altijd 2. Maar dat is niet zo'n probleem. Dus voor mij heeft deze query eigenlijk geen nadelen meer behalve dat 'ie niet echt mooi is.
Gewijzigd op 12/06/2010 10:03:08 door Jelmer rrrr
Gesponsorde koppelingen:
Code (php)
1
2
3
4
5
6
2
3
4
5
6
INSERT INTO pairs
(pair_key, pair_value, mtime, origin_id, user_id)
VALUES (:key, :value, :mtime, :origin_id, :user_id)
ON DUPLICATE KEY UPDATE
pair_value = IF(mtime > :mtime, pair_value, :pair_value),
mtime = IF(mtime > :mtime, mtime, :mtime)
(pair_key, pair_value, mtime, origin_id, user_id)
VALUES (:key, :value, :mtime, :origin_id, :user_id)
ON DUPLICATE KEY UPDATE
pair_value = IF(mtime > :mtime, pair_value, :pair_value),
mtime = IF(mtime > :mtime, mtime, :mtime)
Gewijzigd op 12/06/2010 10:08:05 door Noppes Homeland



