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

Как да създадете еквивалент на колона за идентичност на SQL Server в Postgres

tl;dr

Сега в Postgres 10 посочете ГЕНЕРИРАНО ПО ПОДРАЗБИРАНЕ КАТО ИДЕНТИЧНОСТ според стандарта SQL.

create table tower 
(
  npages integer, 
  ifnds integer, 
  ifnid integer, 
  name varchar(20), 
  towid integer GENERATED BY DEFAULT AS IDENTITY    -- per SQL standard
)

Колона за самоличност

Postgres 10 вече поддържа концепцията за колона за самоличност и използва стандартен SQL синтаксис. Въпреки че не съм експерт по MS SQL Server, вярвам, че тази нова стандартна поддръжка е еквивалентна.

ГЕНЕРИРАНО... КАТО ИДЕНТИЧНОСТ

ГЕНЕРИРАНО... КАТО ИДЕНТИЧНОСТ команда, използвана по време на CREATE TABLE създава имплицитна последователност. Създаването, именуването, разрешенията и премахването на тази последователност е прозрачно за вас, за разлика от SERIAL . Много интуитивен сега. Ако предоставите разрешение за използване на таблицата, те получават разрешение за последователността. Ако изпуснете таблицата, последователността се изпуска автоматично.

Два варианта на стандартния синтаксис. Разликата има значение само ако подадете стойност, вместо да оставите стойност да бъде генерирана. Обикновено хората винаги разчитат на генерираната стойност, така че обикновено просто бихте използвали първата версия, ГЕНЕРИРАНО ПО ПОДРАЗБИРАНЕ КАТО ИДЕНТИЧНОСТ .

  • ГЕНЕРИРАНО ПО ПОДРАЗБИРАНЕ КАТО ИДЕНТИЧНОСТ
    • Генерира стойност, освен ако INSERT команда предоставя стойност.
  • ГЕНЕРИРАН ВИНАГИ КАТО ИДЕНТИЧНОСТ
    • Игнорира всяка стойност, предоставена от INSERT освен ако не посочите ПОДМЕНЯНЕ НА СИСТЕМНА СТОЙНОСТ

Вижте СЪЗДАВАНЕ НА ТАБЛИЦА страница за документация.

Прочетете тази интересна страница от Питър Айзентраут. Той обяснява някои странни проблеми с SERIAL . Няма такива проблеми с новата функция на колоната за самоличност. Така че няма причина да използвате SERIAL вече няма недостатъци, само предимства; СЕРИЕН се замества от ГЕНЕРИРАН … КАТО ИДЕНТИЧНОСТ .

Имайте предвид, че колона за самоличност не е непременно първичен ключ и не се индексира автоматично. Така че все още трябва да посочите PRIMARY KEY изрично, ако това е вашето намерение (както би бил типичният случай).

CREATE TABLE person_ (

    id_ 
        INTEGER 
        GENERATED BY DEFAULT AS IDENTITY   -- Replaces SERIAL. Implicitly creates a SEQUENCE, specified as DEFAULT.
        PRIMARY KEY                        -- Creates index. Specifies UNIQUE. Marks column for relationships.
        ,

    name_ 
        VARCHAR( 80 )

) ;

Намерението е вътрешните подробности за изпълнението да бъдат скрити от вас. Няма нужда да знаете името на последователността, която се генерира под завивките. Например, можете да нулирате брояча чрез колоната, без да знаете основната последователност.

ALTER TABLE person_ 
    ALTER COLUMN id_ 
    RESTART WITH 1000      -- Reset sequence implicitly, without a name.
;

Неявно указване на идентичност:

  • Отбелязва колоната NOT NULL
  • Създава последователност
    • Типът на последователността съответства на колоната (32-битов, 64-битов и т.н.)
  • Свързва последователността с колоната
    • Наследява разрешения
    • Каскади падащи
    • Остава свързан с колоната, дори ако колоната е преименувана
  • Определя последователността като източник на стойности по подразбиране за тази колона

Колоната за самоличност може да приема същите опции като CREATE SEQUENCE :

  • ЗАПОЧНЕТЕ С начало
  • Минимална стойност MINVALUE | БЕЗ МИНИМАЛНА СТОЙНОСТ
  • MAXVALUE maxvalue | НЯМА МАКСИМАЛНА СТОЙНОСТ
  • INCREMENT [ BY ] увеличение
  • ЦИКЪЛ | БЕЗ ЦИКЪЛ
  • КЕШ кеш
  • НЕ ПРИТЕЖАВАН ОТ НИКОЙ
    (посочването на собственост за колона за самоличност няма смисъл за мен, тъй като собствеността се управлява автоматично)

Глупав пример за опции:

id_ INTEGER 
GENERATED BY DEFAULT AS IDENTITY ( 
    START WITH 200 
    MINVALUE 100 
    MAXVALUE 205 
    CYCLE 
    INCREMENT BY 3 
) PRIMARY KEY

Добавяне на 4 реда:



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Групово вмъкване на postgres, където клеймото има нулево ограничение, зададено чрез секвализиране

  2. Как да проверите за чакащи операции в транзакция на PostgreSQL

  3. Таблица Печат не отговаря на размера на страницата

  4. SQL заявка 6 степени на разделяне за мрежов анализ

  5. Добавяне на Postgres обекти към Template1