/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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.

Søg
Reklame
Statistik
Spørgsmål : 177458
Tips : 31962
Nyheder : 719565
Indlæg : 6408173
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste