|
| MySQL: IF EXISTS ... BEGIN ... END Fra : thomas@it-snedkeren.~ |
Dato : 02-05-06 09:20 |
|
Hejsa
Jeg har en MySQL-databasen, som bliver opdateret hver morgen med
outputtet fra et script.
Nogle rækker skal indsættes og nogle skal opdateres. Nu bliver dette
gjort på følgende måde (koden er i det virkelige liv skrevet i PHP):
id = "SELECT id FROM tabel WHERE <betingelser>"
IF ( id > 0 ) THEN
<kør en update-SQL>
ELSE
<kør in insert-SQL>
id = "SELECT last_insert_id()"
ENDIF
Dvs. hver insert/update består af 2-3 SQL-statements, og det er lidt
træls, hvis man kan nøjes med een.
I Microsoft SQL-server kan man gøre:
IF EXISTS (SELECT * FROM tabel WHERE <betingelser>)
BEGIN
<update>
END
ELSE
BEGIN
<insert>
END
Men det kan man ikke i MySQL (og det koster stadig 2-3 SQL-statements).
Man kan så i stedet gøre gøre følgende:
INSERT INTO tabel (...) VALUES (...) ON DUPLICATE KEY <felt>=<ny
værdi>, ...
På den måde bliver der automagisk kørt en update, hvis rækken
findes i forvejen, men man har til gengæld ingen mulighed for at få
ID for den nye/opdaterede række.
Er der virkelig ikke en måde at gøre dette på i MySQL 5 uden at
skulle ud i en IF-THEN-ELSE?
--
Mvh.
/Thomas
| |
Martin (02-05-2006)
| Kommentar Fra : Martin |
Dato : 02-05-06 22:40 |
|
thomas@it-snedkeren.dk wrote:
> INSERT INTO tabel (...) VALUES (...) ON DUPLICATE KEY <felt>=<ny
> værdi>, ...
>
> På den måde bliver der automagisk kørt en update, hvis rækken
> findes i forvejen, men man har til gengæld ingen mulighed for at få
> ID for den nye/opdaterede række.
Hvis du har lign. i dine records
tabel
-----
a (primær nøgle)
b
c
og med følgende indhold
a = 1
b = 2
c = 3
og du så fyre følgende af.
INSERT INTO table (a,b,c) VALUES (1,2,3)
ON DUPLICATE KEY UPDATE c=c+1;
så skulle du gerne ende med følgende
a = 1
b = 2
c = 4
INSERT INTO table (a,b,c) VALUES (2,2,3)
ON DUPLICATE KEY UPDATE c=c+5;
så skulle du gerne ende med at have
a = 2
b = 2
c = 3
+ de rækker fra før.
| |
|
|