对序列列的引用(postgresql)
创建引用序列的外键时遇到问题,请参见下面的代码示例。对序列列的引用(postgresql),postgresql,reference,sequences,Postgresql,Reference,Sequences,创建引用序列的外键时遇到问题,请参见下面的代码示例。 但是在创建表时,我收到了以下错误。 “详细信息:关键列“产品”和“id”的类型不兼容:integer和ownseq” 我已经为product列尝试了不同的数据类型(如smallint、bigint),但没有一种被接受 CREATE SEQUENCE ownseq INCREMENET BY 1 MINVALUE 100 MAXVALUE 99999; CREATE TABLE products ( id ownseq PRIMARY
但是在创建表时,我收到了以下错误。
“详细信息:关键列“产品”和“id”的类型不兼容:integer和ownseq”
我已经为product列尝试了不同的数据类型(如smallint、bigint),但没有一种被接受
CREATE SEQUENCE ownseq INCREMENET BY 1 MINVALUE 100 MAXVALUE 99999;
CREATE TABLE products (
id ownseq PRIMARY KEY,
...);
CREATE TABLE basket (
basket_id SERIAL PRIMARY KEY,
product INTEGER FOREIGN KEY REFERENCES products(id));
关键的变化是id
被定义为整数
,而不是ownseq
。如果使用SERIAL
伪类型创建序列,就会出现这种情况。试试看
CREATE TABLE products (
id INTEGER DEFAULT nextval(('ownseq'::text)::regclass) NOT NULL PRIMARY KEY,
...);
或者不要创建序列ownseq,让postgres为您创建:
CREATE TABLE products (
id SERIAL NOT NULL PRIMARY KEY
...);
在上述情况下,postgres创建的序列名称应为products\u id\u seq
希望这有帮助。PostgreSQL功能强大,您刚刚被一项高级功能所困扰 您的DDL非常有效,但与您认为的完全不同 序列可以看作是一个额外的事务性简单表,用于为某些列生成下一个值 你想做什么 您的意思是按照另一个答案定义id字段:
id integer PRIMARY KEY default nextval('ownseq'),
你做了什么
实际上,您所做的是为表定义嵌套数据结构。假设我创建了一个测试序列:
CREATE SEQUENCE testseq;
然后假设我在第9.1页的testseq上,我得到:
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中,这类功能实际上非常强大,但却充满了意想不到的地方(例如,对于嵌套数据类型,NOTNULL和check约束无法按预期工作)。我一般不推荐嵌套数据类型,但值得一提的是,PostgreSQL可以做到这一点,并且会乐于接受SQL命令,在没有任何警告的情况下做到这一点。
主键
意味着非空
,因此后者是不必要的。是的,根据版本的不同,需要转换为regclass
。此语法是否在“create table”语句中创建序列?是否可以像原始语句一样设置最小值和最大值?@DJake您是指serial
语法吗?如果是,请参阅。它只是创建唯一标识符列的一种符号方便,其等价物是一系列语句。其中一条语句是创建序列tablename\u colname\u seq
。这里似乎不可能有最小值或最大值。
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)