INSERT en UPDATE combineren

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Ward van der Put
Moderator

Ward van der Put

09/01/2015 13:00:20
Quote Anchor link
Normaal gesproken gebruik ik INSERT ... ON DUPLICATE KEY UPDATE ... om in één keer rijen te kunnen toevoegen en/of bijwerken. Wat is het beste alternatief voor databaseplatforms die dit niet ondersteunen?

- MERGE ... WHEN MATCHED ... WHEN NOT MATCHED ...?
- SELECT COUNT(*) voor een controle gevolgd door INSERT of UPDATE?
- DELETE gevolgd door enkel INSERT?
- try INSERT catch UPDATE met een exception?
 
PHP hulp

PHP hulp

24/04/2024 21:38:04
 
Frank Nietbelangrijk

Frank Nietbelangrijk

09/01/2015 17:30:56
Quote Anchor link
Hoi Ward,

Ik snap persoonlijk de behoefte niet.

Bij 99% van de gevallen heb je een primary index kolom, zeg maar even de kolom 'id'.
Is die nul dan INSERT plus $id = mysqli_insert_id; is die > nul dan UPDATE
Gewijzigd op 09/01/2015 17:31:39 door Frank Nietbelangrijk
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/01/2015 17:33:52
Quote Anchor link
Ik denk dat de derde het meest efficiënte is want dan heb je maar twee queries nodig.
MERGE is ook platform specifiek, Postgres heeft dat bv niet geïmplementeerd, die hebben daar weer schrijfbare CTE's voor.
 
Ward van der Put
Moderator

Ward van der Put

09/01/2015 17:40:13
Quote Anchor link
Dank je, Frank! Ik denk dat ik er inderdaad kritischer omheen moet programmeren. Goed punt.

Dat kan alleen niet altijd. Het gaat dan onder andere om de import van productfeeds.
Bestaat het product al, dan volgt de UPDATE van bijvoorbeeld de prijs en voorraad.
Bestaat het product nog niet, dan volgt de INSERT om het product toe te voegen.

De DELETE gevolgd door de INSERT, dank Ger, vond ik niet zo fraai vanwege het potentieel dataverlies en omdat bestaande data een nieuwe index krijgen, maar die moet het dan maar worden.
Gewijzigd op 09/01/2015 17:42:33 door Ward van der Put
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

10/01/2015 11:33:39
Quote Anchor link
Het meest efficiënte kan natuurlijk ook het meest desastreuze zijn. Het is dan ook vrij rigoureus (zo nu ben ik door mijn woordenschat heen), en ik gebruik het alleen in situaties waarin ik niet te maken heb met AI pk's

Bij een productfeed kan je dit niet al niet doen, want dan bestaat de kans dat je een fk violation krijgt.

Wat ik doe is de data uit de feeds in tijdelijke tabellen pompen, en dan die tabellen en de officiële tabellen met elkaar synchroniseren.

En ja Frank die behoefte is er, dat is namelijk het verschil tussen 25000 query's vs 8 query's
 
Frank Nietbelangrijk

Frank Nietbelangrijk

10/01/2015 13:15:01
Quote Anchor link
Ja Ger ik begrijp nu wat het probleem is. Lijkt me enigszins tricky om je producten automatisch aan te laten passen door feeds. Misschien beter zoals Ger zegt een tijdelijke tabel en dan moet er eerst akkoord gegeven worden om een product te wijzigen of wel wijzigen maar de oude versie in een backup-tabel bewaren en wel degelijk de webmaster informeren over de wijziging?

Het is maar een gevoel dat bij me opkomt, ik heb geen ervaring met productfeeds.
 
Ward van der Put
Moderator

Ward van der Put

10/01/2015 13:54:49
Quote Anchor link
Soms is een controle/bevestiging inderdaad gewenst, bijvoorbeeld bij gewijzigde verkoopprijzen.
Maar soms moet het toch automatisch, bijvoorbeeld wanneer je om de zoveel uur de actuele voorraadaantallen ophaalt.

Het bredere technische probleem is dat ik PDO gebruik om verschillende databaseplatforms te kunnen ondersteunen, maar ik *dus* ook geen queries wil schrijven die uitsluitend in MySQL werken. Liefst zie ik schone SQL die bij alle "main stream" databaseservers werkt, zodat je alleen de PDO-driver hoeft in te stellen.

Misschien moet ik er maar een extra methode voor schrijven die op basis van de PDO-driver de platform-specifieke implementatie gebruikt. Dat is, denk ik nu, dan nog het meest betrouwbare alternatief.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

11/01/2015 14:15:53
Quote Anchor link
Een andere optie is om dat gedeelte naar een stored procedure te verplaatsen, dan leg je verschil daar waar het veroorzaakt wordt.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.