On duplicate key (last modifield id)
Ik heb een query en ik wil a de query weten welk id hij heeft aangepast. het is een:
INSERT INTO
blablabl
ON DUPLICATE KEY
UPDATE
constructie..Normaal zou je LAST_INSERT_ID() om je id op te vragen, nu kan het ook natuurlijk een update worden, dus kan ik niet van die functie uitgaan.
Is er dus een functie die mij het record id kan teruggeven, negerend of het nu een insert of update is.
Maar, ik zou deze constructie niet in m'n SQL willen hebben, ik zou de INSERT gewoon laten mislukken en dan besluiten om een UPDATE uit te voeren. Dat geeft je meer controle over wat er precies gebeurt en het werkt ook met andere databases. Daarnaast bestaat er, in theorie, een kans dat de UPDATE plaatsvindt op basis van het id, gebruik per ongeluk een TINYINT voor je ID en na 127 of 255 records zal iedere keer het hoogste id worden bijgewerkt zonder dat je dat direct doorhebt. Je kunt niet aangeven op basis van welke constraint de update moet plaatsvinden.
INSERT => error => SELECT (achterhalen wát er fout gaat) => evt. UPDATE, afhankelijk van de geconstateerde fout.
Als je een duplicate key hebt, moet je dus op een key controleren. Die key heb je dan al opgeslagen ergens in je script in een variabele.
Anders is het ook altijd mogelijk om de bewerkte data op te halen, met een SELECT query, daarvoor heb je ook de gegevens wel in je scriptje staan (in variabelen)
# robert, er staat niks in mijn code, ik insert namelijk en on dup key update ik meteen. Heb ook niet de var die ik nodig heb. Ik wil namelijk de id en die bestaat nog niet.
edit: gevonden oplossing
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?
$a_query_data['s_sql'] .= "
-- Insert or update new/existing relations
INSERT INTO " . $s_join_table . "
(
" . $i_master_id1 . "
," . $i_master_id2 . "
)
VALUES
(
" . $aOptions['s_key_value'] . "
," . $i_relation_key . "
)
ON DUPLICATE KEY
UPDATE i_id = LAST_INSERT_ID(i_id)
;
SET @i_registration_id := LAST_INSERT_ID();
";
?>
$a_query_data['s_sql'] .= "
-- Insert or update new/existing relations
INSERT INTO " . $s_join_table . "
(
" . $i_master_id1 . "
," . $i_master_id2 . "
)
VALUES
(
" . $aOptions['s_key_value'] . "
," . $i_relation_key . "
)
ON DUPLICATE KEY
UPDATE i_id = LAST_INSERT_ID(i_id)
;
SET @i_registration_id := LAST_INSERT_ID();
";
?>
Je verzint het niet, maar het werkt wel...
Gewijzigd op 01/01/1970 01:00:00 door Joep
Maar het doel is bereikt, dat is vaak ook wel wat waard.