Vinnaren i pepparkakshustävlingen!
2006-12-21, 21:43
  #1
Medlem
deadprezs avatar
Hej, jag känner att mina SQL-kunskaper är lite begränsade men har ändå arbetat med språket i flera år, typ uteslutande tillsammans med webbapplikationer.

Ett ganska vanligt förekommande händelseförlopp brukar vara att man vill skapa en rad eller uppdatera en rad, beroende på om det finns en rad som matchar ett visst id sen tidigare i tabellen.

Jag brukar då göra såhär:

SELECT * FROM tblSettings WHERE id=4

om jag får resultat så:
UPDATE tblSettings SET data=xxx WHERE id=4

Om jag inte får resultat så gör jag istället:
INSERT INTO tblSettings SET data=xx, id=4

Det funkar bra och löser problemet, men det känns inte särskilt optimalt. Jag har nyligen börjat lära mig lite om stored procedures (använder MySQL), och inser att jag kan använda en sådan för att göra detta lite bättre, men min fråga är igentligen om inte SQL har någon inbyggd feature för att underlätta med min kod ovan som jag bara har missat. T.ex kanske kan man göra "id" unikt och direkt göra en insert & se om den misslyckades så gör man en update, så blir det iaf bara 2 queries... Hur skulle man göra det isåfall?
Citera
2006-12-22, 00:15
  #2
Medlem
update/inser

Yep.. det går och passar ju bra med stored procedures.

Så här ungefär skulle det bli i MS SQL Server:

CREATE PROCEDURE
SaveStuff (@ID int, @InData varchar(30))
AS

UPDATE tblSettings SET data=@InData WHERE id=@ID
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO tblSettings ......
END

MySQL kan jag inte med det borde finnas nåt liknande där.
Kolla hjälpen/Google
Citera
2006-12-22, 00:39
  #3
Medlem
deadprezs avatar
Tack. Det där såg mycket bättre ut. Har länge saknat möjligheten att stoppa in lite mer logik i mina queries, tror jag ska försöka sätta mig in ordentligt i stored procedures nu alltså.
Citera
2007-04-18, 19:54
  #4
Medlem
MinOrks avatar
beroende på om förutsättningarna stämmer kan du i MySQL använda detta: http://dev.mysql.com/doc/refman/5.0/...duplicate.html

Skulle inte select count(*) from tblSettings WHERE id=4 kunna vara lite bättre än bara select * FROM ...?

MySQL har även REPLACE som först tar bort en rad om den finns och sen petar in en ny.
http://dev.mysql.com/doc/refman/5.0/en/replace.html
Klart, inte samma som INSERT/UPDATE, men kanske funkar ibland.
Citera
2007-04-18, 19:58
  #5
Moderator
Ruskigbusss avatar
Ett alternativ som IBLAND (*) kan vara mer effektivt är att
1. Radera posten - DELETE FROM XXXX WHERE ID=NNN
2. Sätta in en ny - INSERT INTO XXXX (FÄLT,FÄLT, ... ) VALUES( NNN, NNN, ... )

Förutsätter också att man har unika id eller tillräckligt för att kunna peka ut en post. Och självklart att man vet alla data som skall stoppas in i den nya.

* = Hur vet man det då? Testa med din Query Analyzer.
Citera
2007-04-18, 22:49
  #6
Medlem
Jag tycker att REPLACE är smidigt och bortglömt:

Kod:
REPLACE INTO tblSettings 
SET id=4, data=xxx
eller
Kod:
REPLACE INTO tblSettings(id, data) 
VALUES (4, xxx)
Citera
2007-05-06, 10:48
  #7
Medlem
hedets avatar
Citat:
Ursprungligen postat av MinOrk
beroende på om förutsättningarna stämmer kan du i MySQL använda detta: http://dev.mysql.com/doc/refman/5.0/...duplicate.html

Skulle inte select count(*) from tblSettings WHERE id=4 kunna vara lite bättre än bara select * FROM ...?

MySQL har även REPLACE som först tar bort en rad om den finns och sen petar in en ny.
http://dev.mysql.com/doc/refman/5.0/en/replace.html
Klart, inte samma som INSERT/UPDATE, men kanske funkar ibland.

Denna är ju så gott som skräddarsydd för ditt problem, eller hur? Akta dig dock, den är bara kompatibel med mySQL så vitt jag har förstått.
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback