sve*_*eri 2 postgresql primary-key sequence auto-increment
我有一个 postgresql 数据库,在迁移到新版本并导入旧数据后,我的主键出现了问题:
\n\norg.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint \n"browser_link_pkey" Detail: Key (id)=(173) already exists.\nRun Code Online (Sandbox Code Playgroud)\n\n所以我想重置我的序列,但运行:
\n\nselect nextval(\'browser_link_id_seq\')\nRun Code Online (Sandbox Code Playgroud)\n\n也失败:
\n\ncolumn \xe2\x80\x9ebrowser_link_id_seq\xe2\x80\x9c does not exist\nSQL Status:42703\nRun Code Online (Sandbox Code Playgroud)\n\n这是建表的SQL
\n\nCREATE TABLE browser_link (\n id bigint NOT NULL,\n....\n);\nALTER TABLE ONLY browser_link\nADD CONSTRAINT browser_link_pkey PRIMARY KEY (id);\nRun Code Online (Sandbox Code Playgroud)\n\n我尝试选择串行序列,但似乎不存在:
\n\npostgres=# \\connect historify\nYou are now connected to database "historify" as user "postgres".\nhistorify=# select pg_get_serial_sequence(\'browser_link\', \'id\');\n pg_get_serial_sequence\n------------------------\n\n(1 row)\nRun Code Online (Sandbox Code Playgroud)\n\n我正在使用 postgresql 9.5.3。另外,在发生错误之前,id 列确实按预期增加,因此它确实可以工作。
\n\n现在我的两个问题:
\n\nPostgres 中的序列是整数,默认值由序列提供。在以下片段中,表“一”和表“二”完全相同:
CREATE TABLE one
( id bigserial NOT NULL PRIMARY KEY
, name varchar
);
CREATE TABLE two
( id bigint NOT NULL PRIMARY KEY
, name varchar
);
CREATE SEQUENCE "two_id_seq"
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
ALTER SEQUENCE "two_id_seq"
OWNED BY two.id
;
ALTER TABLE two
ALTER COLUMN id SET default nextval('two_id_seq')
;
\d one
\d two
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该表serial的语法one更加紧凑(它实际上是该表所需的 4 个语句的简写符号two)
bigserial因此,在问题表中,您可以使用而不是作为数据类型重建表,或者通过语法bigint将现有序列“附加”到现有列。idALTER table ... ALTER COLUMN ...
您可以通过 'setval('name', val);` 将序列设置为新值:
INSERT INTO two(id, name) VALUES ( 13, 'thirteen' );
select nextval('two_id_seq');
SELECT setval ('two_id_seq', (select max(id) FROM two));
select * from two;
select nextval('two_id_seq');
Run Code Online (Sandbox Code Playgroud)
结果:
INSERT 0 1
nextval
---------
1
(1 row)
setval
--------
13
(1 row)
id | name
----+----------
13 | thirteen
(1 row)
nextval
---------
14
(1 row)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
17923 次 |
| 最近记录: |