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 реда: