我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
当前回答
串行是自动生成唯一值的旧方法,它不是SQL标准的一部分。
在PostgreSQL 10之后,你可以使用生成的作为标识,它符合SQL标准:
CREATE TABLE t1 (id integer primary key generated always as identity);
or
CREATE TABLE t1 (id integer primary key generated by default as identity);
默认和always的区别:
GENERATED ALWAYS指示PostgreSQL总是为标识列生成一个值。如果你试图插入(或更新)值到GENERATED ALWAYS AS IDENTITY列中,PostgreSQL将会发出一个错误。 GENERATED BY DEFAULT还指示PostgreSQL为标识列生成一个值。但是,如果你为insert或update提供了一个值,PostgreSQL将使用这个值来插入到标识列中,而不是使用系统生成的值。
获取更多信息。
其他回答
您可以使用下面的代码自动递增
Create table public.EmployeeDapper
(
Id int not null generated by default as identity(increment by 1 start 1
minvalue 1 maxvalue 2147483647 cache 1),
Name varchar(50) not null,
Age int not null,
Position varchar(50)not null
)
我已经尝试了以下脚本,以成功地自动增加PostgreSQL中的主键。
CREATE SEQUENCE dummy_id_seq
START WITH 1
INCREMENT BY 1
NO MINVALUE
NO MAXVALUE
CACHE 1;
CREATE table dummyTable (
id bigint DEFAULT nextval('dummy_id_seq'::regclass) NOT NULL,
name character varying(50)
);
编辑:
CREATE table dummyTable (
id SERIAL NOT NULL,
name character varying(50)
)
SERIAL关键字自动为各自的列创建一个序列。
在PgAdmin上执行的步骤:
创建序列//如果表存在最后一个id 添加这个序列到主键,table - properties - columns - column_id(主键)edit - Constraints -添加nextval(' sequunence_title '::regclass)到 字段default。
串行是自动生成唯一值的旧方法,它不是SQL标准的一部分。
在PostgreSQL 10之后,你可以使用生成的作为标识,它符合SQL标准:
CREATE TABLE t1 (id integer primary key generated always as identity);
or
CREATE TABLE t1 (id integer primary key generated by default as identity);
默认和always的区别:
GENERATED ALWAYS指示PostgreSQL总是为标识列生成一个值。如果你试图插入(或更新)值到GENERATED ALWAYS AS IDENTITY列中,PostgreSQL将会发出一个错误。 GENERATED BY DEFAULT还指示PostgreSQL为标识列生成一个值。但是,如果你为insert或update提供了一个值,PostgreSQL将使用这个值来插入到标识列中,而不是使用系统生成的值。
获取更多信息。
也许我现在回答这个问题有点晚了,但我正在工作中研究这个问题:)
我想写列'a_code' = c1,c2,c3,c4…
首先,我打开了一个列,名称为ref_id,类型为serial。 然后我用这个命令解决了我的问题:
update myschema.mytable set a_code=cast('c'||"ref_id" as text)