Avatar billede kimlarsen1978 Nybegynder
25. juli 2007 - 15:20 Der er 14 kommentarer og
1 løsning

Hvis findes opdater ellers indsæt?

Hejsa
Hvordan laver jeg følgende smart i MySQL?

Jeg vil gerne tjekke, om der er en post i databasen der skal opdateres, ellers vil jeg indsætte en ny post.

Jeg kunne gøre sådan her (ASP):
***************
'Tjek om posten findes
strSQL = "SELECT ipadresse FROM statistik WHERE ipadresse = '" & ipadresse & "'
set rs = conn.execute(strSQL)
if rs.eof then
  'INDSÆT EN NY POST
else
  'OPDATER DEN EKSISTERENDE
end if
******************

Men kan det ikke gøres bedre? Jeg mener i ét hug mod databasen?
Avatar billede erikjacobsen Ekspert
25. juli 2007 - 15:22 #1
To hug...:

UPDATE
Hvis der ikke er ændret noget så: INSERT
Avatar billede thesurfer Nybegynder
25. juli 2007 - 15:25 #2
Man kan også bruge REPLACE i stedet for UPDATE/INSERT kombinationen..
Avatar billede w13 Novice
25. juli 2007 - 15:25 #3
Jeg er ikke nogen haj til SQL, men du kan i hvert fald spare nogle linjer:

set rs=conn.execute("SELECT * FROM [statistik] WHERE [ipadresse]='"&ipadresse&"')
if rs.eof then 'INDSÆT EN NY POST
if not rs.eof then 'OPDATER DEN EKSISTERENDE
Avatar billede thesurfer Nybegynder
25. juli 2007 - 15:28 #4
w13> IF-ELSE er bedre end 2x IF

kimlarsen1978> Eksempel med REPLACE:

strSQL = "replace into TabellensNavn set KolonnensNavn = 'ny værdi' where KolonnensNavn = 'gammel værdi'"

Så skal den bare afvikles..
Avatar billede michael_stim Ekspert
25. juli 2007 - 15:29 #5
Med nyere MySQL kan ON DUPLICATE KEY bruges.

http://dev.mysql.com/doc/refman/5.1/en/insert-on-duplicate.html
Avatar billede erikjacobsen Ekspert
25. juli 2007 - 15:30 #6
REPLACE er ikke uden problemer, da den fx laver en ny værdi i et autoincrement felt
Avatar billede w13 Novice
25. juli 2007 - 15:31 #7
Ja okay. Jeg har dog aldrig fattet, hvorfor det her ikke kunne være tilladt:

if rs.eof then 'INDSÆT EN NY POST
else 'OPDATER DEN EKSISTERENDE

Det er da irriterende. :)
Avatar billede thesurfer Nybegynder
25. juli 2007 - 15:34 #8
w13> Fordi syntaxen er sådan her:

1 lines IF-sætning: IF betingelse then GØR-NOGET

Flere liniers:
if betingelse then
' gør noget hvis betingelsen er sand
else
' gør noget hvis betingelsen er falsk
end if


erikjacobsen>
Ja, jeg læste lige lidt mere om REPLACE..
Hvis en post eksisterer i forvejen, slettes den og der oprettes en nye.. dvs, den gamle post opdateres IKKE..

Man kan læse om REPLACE her: http://dev.mysql.com/doc/refman/4.1/en/replace.html
..hvor de iøvrigt også nævner og henviser til "ON DUPLICATE KEY UPDATE".. som michael_stim også har henvist til..
Avatar billede w13 Novice
25. juli 2007 - 15:35 #9
thesurfer>> Ja, men det er øv. :P
Avatar billede kimlarsen1978 Nybegynder
25. juli 2007 - 15:50 #10
Hejsa
Jeg har prøvet med:

INSERT INTO statistik (bannerid, hjemmesideid, ipadresse, visning, klik) VALUES (1, 12, 'xx.xx.xxx.xxx', 1, 0) ON DUPLICATE KEY UPDATE visning=visning+1

Men der sker ikke noget, den tæller ikke visning op med 1
Avatar billede kimlarsen1978 Nybegynder
25. juli 2007 - 15:52 #11
Jeg har en samlet "UNIQUE" på felterne
bannerid, hjemmesideid, ipadresse
Avatar billede kimlarsen1978 Nybegynder
25. juli 2007 - 15:57 #12
Hmmm, det nok MySQL serveren der er for gammel...

Serverversion: 5.0.37
MySQL klientversion: 5.0.37
Avatar billede kimlarsen1978 Nybegynder
25. juli 2007 - 16:11 #13
michael_stim -> Men jeg vil gerne give points for linket til version 5.1 og ON DUPLICATE KEY UPDATE...
Avatar billede kimlarsen1978 Nybegynder
13. februar 2010 - 18:52 #14
Nogle der vil smidde et svar?
Avatar billede w13 Novice
13. februar 2010 - 18:58 #15
:)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester