我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。

我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:

错误:序列必须与它所链接的表具有相同的所有者。

有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?


当前回答

我已经尝试了以下脚本,以成功地自动增加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关键字自动为各自的列创建一个序列。

其他回答

试试这个命令:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

尝试使用创建表的同一个db -用户。

在postgresql中自动增加主键:

创建你的表:

CREATE TABLE epictable
(
    mytable_key    serial primary key,
    moobars        VARCHAR(40) not null,
    foobars        DATE
);

在表中插入值:

insert into epictable(moobars,foobars) values('delicious moobar','2012-05-01')
insert into epictable(moobars,foobars) values('WorldWideBlag','2012-05-02')

从表中选择*:

select * from epictable

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobar      | 2012-05-01
           2 | WorldWideBlag         | 2012-05-02
(2 rows)

注意,mytable_key列已自动递增。

ProTips:

你应该总是在你的表上使用一个主键,因为postgresql内部使用哈希表结构来提高插入、删除、更新和选择的速度。如果有一个主键列(强制唯一且非空)可用,则可以依赖它为哈希函数提供唯一的种子。如果没有可用的主键列,散列函数就会变得低效,因为它会选择其他一些列作为键。

如果你想要更多地控制串行键的行为,请参阅postgresql sequences。

您可以使用下面的代码自动递增

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
)

如果您想在序列中使用数字,请使用以下内容定义一个新序列

CREATE SEQUENCE public.your_sequence
    INCREMENT 1
    START 1
    MINVALUE 1
;

然后修改表,使用id的序列:

ALTER TABLE ONLY table ALTER COLUMN id SET DEFAULT nextval('your_sequence'::regclass);

也许我现在回答这个问题有点晚了,但我正在工作中研究这个问题:)

我想写列'a_code' = c1,c2,c3,c4…

首先,我打开了一个列,名称为ref_id,类型为serial。 然后我用这个命令解决了我的问题:

update myschema.mytable set a_code=cast('c'||"ref_id" as text)