如何在PostgreSQL中设置自动增量主键?

时间:2011-10-10 20:56:40

标签: sql postgresql

我在PostgreSQL中有一个包含22列的表,我想添加一个自动增量主键。

我尝试创建一个名为id的BIGSERIAL类型的列,但pgadmin回复时出现错误:

ERROR: sequence must have same owner as table it is linked to.

有谁知道如何解决这个问题?如何在PostgreSQL中添加创建自动递增主键而无需再次重新创建表?

8 个答案:

答案 0 :(得分:270)

尝试此命令:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

尝试使用与创建表格的用户相同的数据库用户。

答案 1 :(得分:244)

在postgresql中自动递增主键:

第1步,创建表格

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

第2步,像这样在表中插入值,注意第一个参数列表中没有指定mytable_key,这会导致默认序列自动增量。

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

第3步,从表中选择*:

el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"

第4步,解释输出:

mytable_key  |        moobars        |  foobars   
-------------+-----------------------+------------
           1 | delicious moobars     | 2012-05-01
           2 | world wide interblags | 2012-05-02
(2 rows)

注意mytable_key列已自动递增。

<强>普罗蒂普:

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

答案 2 :(得分:33)

使用自定义序列在postgresql中创建自动递增主键:

第1步,创建序列:

create sequence splog_adfarm_seq
    start 1
    increment 1
    NO MAXVALUE
    CACHE 1;
ALTER TABLE fact_stock_data_detail_seq
OWNER TO pgadmin;

第2步,创建表格

CREATE TABLE splog_adfarm
(
    splog_key    INT unique not null,
    splog_value  VARCHAR(100) not null
);

第3步,插入表格

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Is your family tree a directed acyclic graph?'
);

insert into splog_adfarm values (
    nextval('splog_adfarm_seq'), 
    'Will the smart cookies catch the crumb?  Find out now!'
);

第4步,观察行

el@defiant ~ $ psql -U pgadmin -d kurz_prod -c "select * from splog_adfarm"

splog_key |                            splog_value                             
----------+--------------------------------------------------------------------
        1 | Is your family tree a directed acyclic graph?
        2 | Will the smart cookies catch the crumb?  Find out now!
(3 rows)

这两行的键从1开始,并按序列的定义递增1。

Bonus Elite ProTip:

程序员讨厌打字,键入nextval('splog_adfarm_seq')很烦人。您可以为该参数键入DEFAULT,如下所示:

insert into splog_adfarm values (
    DEFAULT, 
    'Sufficient intelligence to outwit a thimble.'
);

要使上述工作正常,您必须在splog_adfarm表上为该键列定义默认值。哪个更漂亮。

答案 3 :(得分:16)

如果你想在pgadmin中这样做,那就容易多了。在postgressql中,为了向列添加自动增量,我们首先需要创建一个自动增量序列并将其添加到所需的列。我确实喜欢这个。

1)首先,您需要确保您的表有一个主键。还要将主键的数据类型保留为bigint或smallint。 (我使用bigint,找不到一个名为serial的数据类型,如其他地方的其他答案所述)

2)然后通过右键单击序列 - >添加序列。 添加新序列。  如果表格中没有数据,请按顺序保留序列,不要进行任何更改。只需保存它。 如果存在现有数据,请将主键列中的最后一个或最高值添加到“定义”选项卡中的“当前”值,如下所示。 enter image description here

3)最后,将行nextval('your_sequence_name'::regclass)添加到主键中的默认值,如下所示。

enter image description here 确保序列名称在此处正确。这就是全部,自动增量应该有效。

答案 4 :(得分:2)

如果要在序列中使用数字,请使用类似

的内容定义新序列
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);

答案 5 :(得分:0)

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

我想写专栏&#39; a_code&#39; = c1,c2,c3,c4 ......

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

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

答案 6 :(得分:0)

我已经尝试使用以下脚本来成功自动增加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)
);

答案 7 :(得分:0)

在PgAdmin上执行此操作的步骤:

  • CREATE SEQUENCE sequnence_title START 1; //如果表格存在最后一个ID
  • 将此序列添加到主键,表-属性-列-column_id(主键)编辑-约束-将nextval('sequnence_title':: regclass)添加到 字段默认值。