/ 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 - INSERT + UPDATE?
Fra : Jimmy


Dato : 06-05-03 23:16

Hej

Forestil Jer, at man laver en hjemmeside, hvor brugere skal oprettes og at
de skal kunne redigere i deres data.

Dette vil kræve en INSERT og senere en UPDATE.
Skal jeg tilføje/fjerne et felt skal jeg altså vedligeholde to SQL-strenge.

Hvad synes I om denne tilgang til problemet:

En nyoprettelse klares vha. følgende:

INSERT INTO bruger () VALUES ()
SELECT LAST_INSERT_ID() AS Ref_Bruger_ID
UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID


En redigering af data klares med samme SQL-streng:

UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID


Jeg synes selv metoden er smart, da jeg nu kan oprette og redigere data vha.
samme funktion og fordi jeg kun skal vedligeholde een SQL-streng.

Hvad synes I?
Og er der bedre metoder?

Mvh
Jimmy



 
 
Nikolaj Hansen (11-05-2003)
Kommentar
Fra : Nikolaj Hansen


Dato : 11-05-03 03:04


> INSERT INTO bruger () VALUES ()
> SELECT LAST_INSERT_ID() AS Ref_Bruger_ID
> UPDATE bruger SET felt1=vaerdi1...WHERE ID = Ref_Bruger_ID

Jeg må tilstå, at jeg ikke lige bruger mySQL, men er storbruger af
Oracle og førhen MSSQL. Men her er mine 5 cents:

1. Jeg kan se, at der er kommet transactions i mysql, og du skal i hvert
fald sørge for at lave tabeller af typen InnoDB tabeller, hvor der er
fuld ACID implementering. Ellers vil du støde ind i nedenstående.

2. Hvis du har mange skrivninger og læsninger, vil mySQL give dig
problemer, da der, så vidt jeg ved, ikke er row locking, men kun table
locking. Dvs. at alle læsninger skal vente på en hver update. Også selv
om det er en anden row i den givne tabel.

Lad mig illustrere pkt. 1:

KL.   User 1      User 2

00.01   Insert (ID 1)   ..      Last insert = 1
00.05   ..      Insert (ID 2)   Last insert = 2
00.06   Select (ID 2)   ..      Finder 2 men skulle finde 1
00.08   ..      Select (id 2)   Finder 2 korrekt
00.10   Update (ID 2)   ..      Updater 2 men skulle Update 1.
00.12   ..      Update (id 2)   Updater korrekt 2, men kvæster
               Data fra 1 i processen.

Det ville sikkert ikke dreje sig om minutter som her, men om
millisekunder. However så illustrerer ovenstående godt nok.

Problemet er at du ikke har en atomar hændelse i at oprette og skrive
data til et id. Du skal enten selv kode det, eller finde en database,
der kan styre dette for dig (det kan mysql kan jeg se). Hvis du eks.
koder i java kan du lave noget syncronized kode, der sørger for netop at
kun en process (tråd) kan køre en oprettelse ad gangen.

- Nico


Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste