我试图在插入中使用“不需要”的功能,
这样做时,串口会跳过每个插入的数字,
请帮助我解决这个问题......
mydb=# \d tab1
Table "public.tab1"
Column | Type | Modifiers
--------+---------+---------------------------------------------------
id | integer | not null default nextval('tab1_id_seq'::regclass)
col1 | integer |
col2 | integer |
Indexes:
"tab1_pkey" PRIMARY KEY, btree (id)
mydb=# insert into tab1(id,col1,col2) values (nextval('tab1_id_seq'),1,unnest(array[4,5]));
INSERT 0 2
mydb=# select * from tab1;
id | col1 | col2
----+------+------
1 | 1 | 4
2 | 1 | 5
(2 rows)
mydb=# insert into tab1(id,col1,col2) values (nextval('tab1_id_seq'),2,unnest(array[4,5]));
INSERT 0 2
mydb=# select * from tab1;
id | col1 | col2
----+------+------
1 | 1 | 4
2 | 1 | 5
4 | 2 | 4
5 | 2 | 5
(4 rows)
mydb=# insert into tab1(col1,col2) values(2,unnest(array[4,5]));
INSERT 0 2
mydb=# select * from tab1;
id | col1 | col2
----+------+------
1 | 1 | 4
2 | 1 | 5
4 | 2 | 4
5 | 2 | 5
7 | 2 | 4
8 | 2 | 5
(6 rows)
mydb=# insert into tab1(col2) values(unnest(array[4,5]));
INSERT 0 2
mydb=# select * from tab1;
id | col1 | col2
----+------+------
1 | 1 | 4
2 | 1 | 5
4 | 2 | 4
5 | 2 | 5
7 | 2 | 4
8 | 2 | 5
10 | | 4
11 | | 5
(8 rows)
mydb=# select nextval('tab1_id_seq');
nextval
---------
13
(1 row)
每次插入都会跳过id列中的数字,帮我解决这个问题......
答案 0 :(得分:3)
unnest
返回多行,因此在VALUES
的单行中使用它有点像黑客。虽然它确实有效,但似乎nextval
调用以某种方式进行了两次评估。
您可以将插入编写为INSERT INTO ... SELECT ...
而不是INSERT INTO ... VALUES
:在PostgreSQL中,VALUES
只是一个行构造函数。所以考虑写下这样的东西:
insert into tab1(col1, col2) select 1, unnest(array[4,5])
答案 1 :(得分:1)
如果您使用insert ... select
的from子句中的不需要的函数,则不会跳过额外的ID。
如:
insert into tab1(col1,col2)
select
1, u.val
from
unnest(array[4,5]) as u(val);
我认为通过将它放在一个值子句中,你正在运行一个已弃用的postgresql特定扩展。 Postgresql Documentation说明了这一点:
目前,还可以在select中调用返回集的函数 查询列表。对于查询自己生成的每一行, 调用函数返回集,并为其生成输出行 函数结果集的每个元素。但请注意这一点 功能已弃用,可能会在将来的版本中删除。