Я переключаюсь с MySQL на PostgreSQL и мне было интересно, как я могу делать автоинкрементные значения. В документации PostgreSQL я видел тип данных "serial", но при его использовании я получаю синтаксические ошибки (в v8.0).
579
Я переключаюсь с MySQL на PostgreSQL и мне было интересно, как я могу делать автоинкрементные значения. В документации PostgreSQL я видел тип данных "serial", но при его использовании я получаю синтаксические ошибки (в v8.0).
Ответы:
Да, SERIAL - эквивалентная функция.
SERIAL - это просто макрос создания табличного времени вокруг последовательностей. Вы не можете изменить SERIAL на существующий столбец.
источник
"Table"
а"table"
затем просто оставить его без кавычек и канонизировать егоtable
. Соглашение просто никогда не использовать кавычки в Pg. Вы можете, если хотите, использовать смешанные имена падежей для внешнего вида, просто не требуйте этого:CREATE TABLE fooBar ( .. ); SELECT * FROM fooBar;
будет работать, как и будетSELECT * FROM foobar
.Вы можете использовать любой другой тип целочисленных данных , например
smallint
.Пример :
Лучше использовать свой собственный тип данных, а не пользовательский серийный тип данных .
источник
CREATE SEQUENCE
postgresql.org/docs/8.1/interactive/sql-createsequence.html ). , ОДНАКО, я не совсем уверен, почему вы сменили владельца.Если вы хотите добавить последовательность к идентификатору в таблице, которая уже существует, вы можете использовать:
источник
ALTER COLUMN user_id
?ERROR: syntax error at or near "DEFAULT"
какие-либо предложения?Хотя похоже, что последовательности эквивалентны MySQL auto_increment, есть некоторые тонкие, но важные различия:
1. Неудачные запросы увеличивают последовательность / серийный номер
Последовательный столбец увеличивается при неудачных запросах. Это приводит к фрагментации неудачных запросов, а не просто к удалению строк. Например, выполните следующие запросы в вашей базе данных PostgreSQL:
Вы должны получить следующий вывод:
Обратите внимание, как uid идет от 1 до 3 вместо 1 до 2.
Это все еще происходит, если вы должны были вручную создать свою собственную последовательность с:
Если вы хотите проверить, как MySQL отличается, запустите следующее для базы данных MySQL:
Вы должны получить следующее без утомления :
2. Ручная установка значения последовательного столбца может привести к сбою будущих запросов.
Это было указано @trev в предыдущем ответе.
Чтобы смоделировать это вручную, установите для uid значение 4, которое позже будет «конфликтовать».
Данные таблицы:
Запустите еще одну вставку:
Данные таблицы:
Теперь, если вы запустите другую вставку:
Сбой со следующим сообщением об ошибке:
Напротив, MySQL будет обрабатывать это изящно, как показано ниже:
Теперь вставьте другую строку без установки UID
Запрос не сбоит, uid просто переходит на 5:
Тестирование проводилось на MySQL 5.6.33, для Linux (x86_64) и PostgreSQL 9.4.9.
источник
Начиная с Postgres 10, также поддерживаются столбцы идентификаторов, определенные стандартом SQL:
создает столбец идентификаторов, который не может быть переопределен без явного запроса. Следующая вставка завершится ошибкой со столбцом, определенным как
generated always
:Однако это может быть отменено:
При использовании опции
generated by default
это, по сути, то же поведение, что и существующаяserial
реализация:Когда значение вводится вручную, базовая последовательность также должна быть скорректирована вручную - так же, как для
serial
столбца.Столбец идентификации не является первичным ключом по умолчанию (как
serial
столбец). Если это так, ограничение первичного ключа необходимо определить вручную.источник
Извините, перефразирую старый вопрос, но это был первый вопрос / ответ о переполнении стека, который появился в Google.
В этом посте (который впервые появился в Google) рассказывается об использовании более обновленного синтаксиса для PostgreSQL 10: https://blog.2ndquadrant.com/postgresql-10-identity-columns/
что бывает:
Надеюсь, это поможет :)
источник
GENERATED … AS IDENTITY
команды являются стандартным SQL. Сначала добавлено в SQL: 2003 , затем уточнено в SQL: 2008 . Смотрите особенности # T174 & F386 & T178.Вы должны быть осторожны, чтобы не вставить непосредственно в поле SERIAL или sequence, иначе ваша запись не будет выполнена, когда последовательность достигнет вставленного значения:
источник
В контексте заданного вопроса и в ответ на комментарий @ sereja1c создание
SERIAL
неявно создает последовательности, поэтому для приведенного выше примера:CREATE TABLE
будет неявно создавать последовательностьfoo_id_seq
для последовательного столбцаfoo.id
. Следовательно,SERIAL
[4 байта] хороша для простоты использования, если вам не нужен конкретный тип данных для вашего идентификатора.источник
Этот способ будет работать наверняка, надеюсь, он поможет:
Вы можете проверить это в следующей ссылке: http://www.postgresqltutorial.com/postgresql-serial/
источник
Начиная с PostgreSQL 10
источник