Doe dat niet! OOIT ! Denk er niet eens aan om dat te doen!
Deze VERKEERDE oplossing lijkt misschien (niet) voor u te werken:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
MAAR , als iemand tegelijkertijd met jou probeert in te voegen, krijgen jullie allebei dezelfde id
, wat een ongeldig resultaat zal veroorzaken. Je zou echt een sequence
moeten gebruiken of een betrouwbaarder mechanisme (een hulptabel is gebruikelijk als je geen gaten in de reeks kunt hebben, maar het heeft enkele nadelen [hij zal vergrendelen]). Je kunt zelfs serial
. gebruiken gegevenstype om het gemakkelijker te maken (het creëert een reeks eronder):
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', ...);
Als je echt, echt, ECHT geen reeks kunt maken en gebruiken, kun je het bovenstaande doen, maar je zult met de uitzondering moeten omgaan (ervan uitgaande dat de id
veld is PK of UK, en gebruik een read-committe transactie), zoiets (in 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;
Maar nogmaals, ik raad je ten zeerste aan om het te vermijden:gebruik een reeks en wees gelukkig... =D
Ik weet ook dat het een voorbeeld is, maar gebruik de lijst met expliciete kolommen op INSERT INTO
clausule.