Автоинкремент, более правильный?


#1

Добрый день. Имеется в наличии postgres 10.
Создать хотим таблицу например так:

CREATE TABLE table1 (
  uid int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
  col_b integer NOT NULL,
  CHECK (col_b>=0)
);

или так:

CREATE TABLE table2 (
  uid serial NOT NULL PRIMARY KEY,
  col_b integer NOT NULL,
  CHECK (col_b>=0)
);

Вопрос: есть ли разница в использовании “uid int GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY” или " uid serial NOT NULL PRIMARY KEY"? Преимущества?


#2

Здравствуйте!

Оба варианта идентичны, т.к. в основе лежат специальные объекты БД - последовательности (sequences), которые будут созданы в любом случае (имя будет дано автоматически). Просто 1-й вариант использует синтаксис стандарта SQL, а 2-й - псевдотип PostgreSQL.


#3

Вот как описывает разницу автор патча:
https://blog.2ndquadrant.com/postgresql-10-identity-columns/


#4

Отличная статья! Не знал таких тонкостей. Спасибо.