När jag lägger till en ny användare kör jag en SELECT på hela tabellen, sorterar på användarnummer DESC och tar den första postens värde +1. Nu har jag hört om SQL uttrycket MAX, är det ett prestandamässigt bättre sätt att göra det? Autoincrement är det rätta sättet. Att försöka fixa det på andra sätt kan vid hög belastning på servern (många trådar) leda till att det blir fel: tråd 1 hittar max = M, tråd 2 hittar max = M, tråd 2 skapar en ny post med id = M + 1, tråd 1 skapar en ny post med id = M + 1. Båda trådarna har därmed skapat varsin post med samma id. Det var inte så lyckat... Det där hängde jag inte med på... så du menar att vid hög belastning så kör servern flera frågor parallellt och blandar ihop dem enligt eget tycke?! Ja, flera trådar kan hantera samma webbsida samtidigt och arbeta mot samma databas samtidigt. Därför är det inte heller helt säkert att lägga in en ny rad i databasen och bara ta en "SELECT MAX(id) FROM tabell" och sedan använda sig av detta id annanstans eftersom man då inte kan vara säker på att ingen annan lagt in ett nytt id just före du gör MAX förfrågan. Nu är jag helt snurrig - om användare A kör en SQL som söker ut något, och användare B också kör en fråga, så säger du att servern kan blanda ihop deras svar och ge svar A till användare B??? Inte blanda ihop, utan att den ena processen/användaren inte hinner skapa en ny post innan den andre hämtar ut MAX. De får därför ut samma MAX och använder detta för att skapa nästa id. Men det innebär alltså att om jag har ett löpnummer, en serie som är unik för varje användare men inte unik i databasen, så är det inga problem att använda denna teknik med MAX()+1, problemet uppstår när två anrop görs mot samma nummerserie, eller? Ja, såvida inte samma användarkonto är inloggat flera gånger samtidigt.SQL: MAX() eller kontrollera med kod?
Sv: SQL: MAX() eller kontrollera med kod?
Sv:SQL: MAX() eller kontrollera med kod?
Sv: SQL: MAX() eller kontrollera med kod?
Sv:SQL: MAX() eller kontrollera med kod?
Hmm.. nu tror jag att jag fattar... om detta summerar (från swesecure.com)
Detta sätt ser ut att vara teknik som identitetskolumen fungerar, men det skiljer sig på en viktig punkt. Identitetskolumn skapar aldrig samma värde två gånger, det kan däremot max()+1-tekniken göra. Ponera att vi raderar den senast inlagda raden ur tabellen. Då kommer max()+1 tekniken att ge samma värde igen till nästkommande rad medan identitetskolumnen kommer att dela ut ett nytt värde. Om vi exempelvis har raderna 1,2,3 och raderar nummer 3 så kommer det med max()+1 ge värderna 1,2,3 (igen) medan identitetskolumnen kommer att ge värderna 1,2,4.Sv: SQL: MAX() eller kontrollera med kod?
Sv:SQL: MAX() eller kontrollera med kod?
Sv: SQL: MAX() eller kontrollera med kod?
/Johan