PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

PostgreSQL:сериен срещу самоличност

serial е "старата" реализация на автоматично генерирани уникални стойности, която е част от Postgres от векове. Това обаче не е част от стандарта SQL.

За да бъде по-съвместим със стандарта SQL, Postgres 10 въведе синтаксиса, използвайки generated as identity .

Основната реализация все още се основава на последователност, дефиницията вече е в съответствие със стандарта SQL. Едно нещо, което този нов синтаксис позволява, е да се предотврати случайно замяна на стойността.

Помислете за следните таблици:

create table t1 (id serial primary key);
create table t2 (id integer primary key generated always as identity);

Сега, когато стартирате:

insert into t1 (id) values (1);

Основната последователност и стойностите в таблицата вече не са синхронизирани. Ако стартирате друг

insert into t1 default_values;

Ще получите грешка, защото последователността не е била напреднала от първото вмъкване и сега се опитва да вмъкне стойността 1 отново.

С втората таблица обаче,

insert into t2 (id) values (1);

Резултати в:

ERROR: cannot insert into column "id"
Detail: Column "id" is an identity column defined as GENERATED ALWAYS.

Така че можете случайно да "забравите" използването на последователността. Все още можете да принудите това, като използвате override system value опция:

insert into t2 (id) overriding system value values (1);

което все още ви оставя с последователност, която не е синхронизирана със стойностите в таблицата, но поне сте били наясно с това.

Препоръчително е да използвате новия синтаксис на идентичността, а не сериен




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Предайте множество набори или масиви от стойности към функция

  2. Забравих паролата, която въведох по време на инсталацията на postgres

  3. grake db:create хвърля база данни не съществува грешка с postgresql

  4. Как да групирате Odoo 12 с PostgreSQL поточно репликация за висока наличност

  5. Името на таблица или колона не може да започва с число?