Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对序列列的引用(postgresql)_Postgresql_Reference_Sequences - Fatal编程技术网

对序列列的引用(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)