Я вставил вручную две новые записи, установив идентификатор как max (id)+1**
Этот подход совершенно неверен и не будет работать в ни в одной базе данных. До сих пор это работало для вас только в MySQL по счастливой случайности.
Если два соединения одновременно запускают это, они получат один и тот же идентификатор. Он может работать надежно только в том случае, если вы заблокируете таблицу от параллельного чтения, чтобы только одно соединение могло получать идентификатор за раз.
Это также ужасно неэффективно.
Вот почему существуют последовательности, чтобы вы могли надежно получать идентификаторы при наличии параллельных вставщиков.
Просто используйте:
INSERT INTO my_table(data1, data2) VALUES ('a','b') RETURNING id;
or:
INSERT INTO my_table(id, data1, data2) VALUES (DEFAULT, 'a','b') RETURNING id;
DEFAULT
— это специальный заполнитель, который сообщает базе данных, что нужно получить значение по умолчанию для этого столбца из определения таблицы. Значение по умолчанию — nextval('my_table_id_seq')
, поэтому будет вставлено следующее значение последовательности.
Поскольку вы задаете основные вопросы о последовательностях, я рекомендую вам также учитывать, что последовательности не являются бесконечными. Для последовательностей нормально иметь «дыры», где значения таблицы идут 1, 3, 4, 5, 9, 10, ....
23.08.2013
serial
иauto_increment
в базе данных. Не связывайтесь с ними вообще. Если вы позволите базе данных присвоить значениеserial
, то последовательность будет обновлена, и все будет в порядке; если вы вручную присвоите значение, вам придется вручную обновить последовательность. 23.08.2013