Gør det ikke! NOGENSINDE ! Tænk ikke engang på at gøre det!
Dette FORKERTE løsningen ser ud til (det gør den ikke) til at virke for dig:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
MEN , hvis nogen forsøger at indsætte på samme tid som dig, vil I begge få det samme id
, hvilket vil forårsage et ugyldigt resultat. Du burde virkelig bruge en sequence
eller en mere pålidelig mekanisme (et hjælpebord er almindeligt, når du ikke kan have huller i rækkefølgen, men det har nogle ulemper [det vil låse]). Du kan endda bruge serial
datatype for at gøre det nemmere (det opretter en sekvens nedenunder):
CREATE TABLE lists(id serial, col2 text, col3 text, ...);
-- If you don't specify "id", it will autogenerate for you:
INSERT INTO lists(col2, col3, ...) VALUES('KO','SPH', ...);
-- You can also specify using DEFAULT (the same as above):
INSERT INTO lists(id, col2, col3, ...) VALUES(DEFAULT, 'KO','SPH', ...);
Hvis du virkelig, virkelig, VIRKELIG, ikke kan oprette og bruge en sekvens, kan du gøre som ovenstående, men du bliver nødt til at håndtere undtagelsen (forudsat id
feltet er PK eller UK, og ved at bruge en læst forpligtet transaktion), sådan noget (i PL/pgSQL):
DECLARE
inserted bool = false;
BEGIN
WHILE NOT inserted LOOP;
BEGIN
INSERT INTO lists
VALUES ((SELECT coalesce(max(id),0)+1 FROM lists),'KO','SPH', '5');
inserted = true;
EXCEPTION
WHEN unique_violation THEN
NULL; -- do nothing, just try again
END;
END LOOP;
END;
Men igen, jeg anbefaler dig stærkt at undgå det:brug en sekvens og vær glad... =D
Jeg ved også, at det er et eksempel, men brug en eksplicit kolonneliste på INSERT INTO
klausul.