PostgreSQL мощен, и вас только что поразила расширенная функция.
Ваш DDL вполне действителен, но совсем не то, что вы думаете.
Последовательность можно рассматривать как простую внетранзакционную таблицу, используемую для генерации следующих значений для некоторых столбцов.
Что вы хотели сделать
Вы хотели, чтобы поле id было определено таким образом, как в другом ответе:
id integer PRIMARY KEY default nextval('ownseq'),
Что вы сделали
То, что вы сделали, это фактически определили вложенную структуру данных для вашей таблицы. Предположим, я создаю тестовую последовательность:
CREATE SEQUENCE testseq;
Тогда предположим, что я \d testseq
на стр. 9.1, я получаю:
Sequence "public.testseq"
Column | Type | Value
---------------+---------+---------------------
sequence_name | name | testseq
last_value | bigint | 1
start_value | bigint | 1
increment_by | bigint | 1
max_value | bigint | 9223372036854775807
min_value | bigint | 1
cache_value | bigint | 1
log_cnt | bigint | 0
is_cycled | boolean | f
is_called | boolean | f
Это определение типа используемой последовательности.
Теперь предположим, что я:
create table seqtest (test testseq, id serial);
Я могу вставить в него:
INSERT INTO seqtest (id, test) values (default, '("testseq",3,4,1,133445,1,1,0,f,f)');
Затем я могу выбрать из него:
select * from seqtest;
test | id
----------------------------------+----
(testseq,3,4,1,133445,1,1,0,f,f) | 2
Более того, я могу расширить тест:
SELECT (test).* from seqtest;
select (test).* from seqtest;
sequence_name | last_value | start_value | increment_by | max_value | min_value
| cache_value | log_cnt | is_cycled | is_called
---------------+------------+-------------+--------------+-----------+----------
-+-------------+---------+-----------+-----------
| | | | |
| | | |
testseq | 3 | 4 | 1 | 133445 | 1
| 1 | 0 | f | f
(2 rows)
Такого рода вещи на самом деле очень эффективны в PostgreSQL, но полны неожиданных поворотов (например, не нуль и проверочные ограничения не работают должным образом с вложенными типами данных). Обычно я не рекомендую вложенные типы данных, но стоит знать, что PostgreSQL может это делать и будет рад принять команды SQL для этого без предупреждения.
person
Chris Travers
schedule
28.02.2013