Die Werte erst zu löschen halte ich für schlecht weil dann die
price_id, welche ja ein AUTO_INCREMENT hat, immer höher geht. Auch müssen alle INDEXe neu geschrieben werden nach einem DELETE und INSERT.
Wo ist das Problem mit dem simplen UPDATE mittels JOIN, wie ich es erklärt habe ?
Meine Aussage
[...]
Wenn man auf products_id, quantity einen unique Index setzen würde könnte man sogar immer ein INSERT machen, mit
ON DUPLICATE KEY UPDATE.
[...]
Ist übrigens nicht richtig. Ein
INSERT () VALUES () ON DUPLICATE KEY UPDATE...
kann man auch ohne weitere UNIQUE INDEXe machen, denn
price_id hat ja einen PRIMARY KEY.
Z.B.:
INSERT INTO personal_offers_by_customers_status_1 (products_id, quantity, personal_offer)
VALUES ((SELECT products_id FROM products WHERE products_model = '9072537'), 1 , 1.15) ON DUPLICATE KEY UPDATE products_id = VALUES(products_id), quantity = VALUES(quantity), personal_offer = VALUES(personal_offer);
Mittels der Syntax die
oneQ geliefert hat könnte man so sogar alle nötigen Rows mit einer Query updaten.
Ich würde das INSERT O D K U allerdings nicht empfehlen, denn meines Wissens nach ist es langsamer als ein UPDATE mittels JOIN.
Es gäbe auch noch REPLACE INTO, was ich jedoch nicht empfehlen würde, denn es löscht erst den Eintrag um ihn dann neu zu schreiben, was 1., wie eingangs erwähnt, das AUTO_INCREMENT der
price_id immer höher werden lässt und 2. das DBMS zwingt jedesmal die INDEXe neu zu erstellen.
Die Entscheidung welchen Weg du nimmst würde ich davon abhängig machen wieviele Artikel es betrifft und wie oft du das machen mußt.
Hier nochmals meine Empfehlung, damit du sie nicht suchen mußt:
UPDATE personal_offers_by_customers_status_X pobcs
JOIN products p
ON p.products_id = pobcs.products_id
SET personal_offer = 1.23
WHERE p.products_model = 'DerBesteArtikel007'
AND pobcs.quantity = 1;
Gruß,
noRiddle
*NACHTRAG*
Bei sehr vielen betroffenen Rows (Artikeln) bei einem Preis-Update kann es das Ganze ein wenig schneller machen wenn du den INDEX auf
products_model UNIQUE machst (was er eigentlich ohnehin sein sollte).