Не делай этого! EVER! Даже не думайте об этом!
Это НЕПРАВИЛЬНО решение может казаться (не) работать для вас:
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 или Великобритании, а также с помощью зафиксированной транзакции чтения), что-то подобное (в 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
.
Таким образом, вы хотите, чтобы поведение было как последовательность («auto-increment»), без использования последовательности. Почему нет? Эти вещи существуют для решения проблем, которые в противном случае вы легко могли бы использовать с параллельными вставками. – deceze
Я просто хочу вставить новую запись, не меняя структуру БД ... – Jacob
Если это исключительный случай, хорошо ... Если это нормальный modus operandi, возможно, вам следует изменить структуру базы данных. – deceze