Недей така! НИКОГА ! Дори не си и помисляйте да правите това!
ТоваГРЕШНО решението може да изглежда (не) работи за вас:
INSERT INTO lists VALUES ((SELECT max(id)+1 FROM lists),'KO','SPH', '5');
НО , ако някой се опита да вмъкне едновременно с вас, и двамата ще получите един и същ id
, което ще доведе до невалиден резултат. Наистина трябва да използвате sequence
или някакъв по-надежден механизъм (спомагателна маса е често срещана, когато не можете да имате дупки в последователността, но има някои недостатъци [ще заключи]). Можете дори да използвате serial
тип данни за улеснение (създава последователност отдолу):
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', ...);
Ако наистина, наистина, НАИСТИНА, не можете да създадете и използвате последователност, можете да направите както по-горе, но ще трябва да се справите с изключението (приемайки id
полето е PK или UK и използва транзакция с ангажимент за четене), нещо подобно (в 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;
Но отново, горещо ви препоръчвам да го избягвате:използвайте последователност и бъдете щастливи... =D
Освен това знам, че е пример, но използвайте изричен списък с колони на INSERT INTO
клауза.