PDA

Bekijk Volledige Versie : update met dubbele primairykey



bjorri
20/05/08, 08:35
Goede morgen,

PHP redelijk nieuwe versie, MySQL versie 5.0 of 5.1.

Voor een vereniging bouw ik een aanmeldsysteem met daarin een
koppeltabel om te zien wie er mee gaat met welke toer, twee kolommen die
samen primary key zijn, dat kwam ik ergens tegen en het lijkt me ook de
meest logische oplossing.

INSERT werkt, DELETE ook. Echter:

INSERT INTO `koppelmenstoer`
VALUES( '$idtoer','$idmens')

Werkt weliswaar prima maar geeft een foutmelding als de key al bestaat,
Een dubbele aanmelding zal best wel eens voorkomen en moet liever geen
foutmelding opleveren.

UPDATE `koppelmenstoer`
VALUES( '$idtoer','$idmens')
WHERE `idtoer`='$idtoer'
AND `idmens`='$idmens'

Geeft geen foutmelding maar ook niet het gewenste resultaat.

Nog wat zitten stoeien met:

INSERT INTO `koppelmenstoer`
VALUES( '$idtoer','$idmens')
ON DUPLICATE KEY UPDATE
diverse probeersels

Maar ook daarmee krijg *ik* of een foutmelding of niet het gewenste
resultaat. Toch denk ik dat ik het in deze richting moet zoeken.

Hoe los ik dit elegant op?

bjorri.

bjorri
20/05/08, 13:55
bjorri wrote:
>
> INSERT INTO `koppelmenstoer`
> VALUES( '$idtoer','$idmens')
>
> Werkt weliswaar prima maar geeft een foutmelding als de key al bestaat,

Het toverwoord blijkt REPLACE te zijn.

Rik Wasmus
20/05/08, 19:55
On Tue, 20 May 2008 13:54:44 +0200, bjorri <geen@nl.invalid> wrote:

> bjorri wrote:
>> INSERT INTO `koppelmenstoer`
>> VALUES( '$idtoer','$idmens')
>> Werkt weliswaar prima maar geeft een foutmelding als de key al bestaat,
>
> Het toverwoord blijkt REPLACE te zijn.

Wat nare gevolgen kan hebben als je foreign key cascades hebt, aangezien
er daadwerkelijk een record verwijderd wordt en daarna toegevoegd. Heb je
die niet, werkt het natuurlijk prima.

Mijn voorkeur gaat onder MySQL uit naar:
INSERT INTO ...ON DUPLICATE UPDATE ... syntax (welke problemen heb je het
over?)

Maar... in jouw geval lijkt een INSERT IGNORE INTO.... ook een prima
oplossing.
--
Rik Wasmus
....spamrun finished