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

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

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

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

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

560173 次浏览

试试这个命令:

ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;

尝试使用与表中创建相同的DB-user。

在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。

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

第一步,创建你的序列:

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
);

第三步,插入到表中

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!'
);

第四步,观察这些行

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。

奖金精英ProTip:

程序员讨厌输入,而输入nextval('splog_adfarm_seq')是很烦人的。你可以输入DEFAULT作为参数,如下所示:

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

为了实现上述功能,您必须为splog_adfarm表上的键列定义一个默认值。哪个更漂亮。

如果您希望在pgadmin中执行此操作,则要容易得多。似乎在postgressql中,要向列中添加一个自动增量,我们首先需要创建一个自动增量序列,并将其添加到所需的列中。我确实喜欢这个。

1)首先,你需要确保你的表有一个主键。同时,主键的数据类型保持为大整型或小整型。(我使用了bigint,找不到一个数据类型称为串行,如在其他地方提到的其他答案)

然后通过右键单击sequence-> 添加新序列添加一个序列。 如果表中没有数据,保持序列不变,不要做任何更改。保存它。 如果有现有数据,将主键列中的最后一个或最大值添加到定义选项卡中的Current值,如下所示。 enter image description here < / p >

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

enter image description here 确保这里的序列名称是正确的。这是所有的和自动递增应该工作

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

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

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

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

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

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);

我已经尝试了以下脚本,以成功地自动增加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.

serial是自动生成唯一值的旧方法,它不是SQL标准的一部分。

PostgreSQL 10之后,你可以使用generated as identity,它符合SQL标准:

CREATE TABLE t1 (id integer primary key generated always as identity);

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将使用该值插入到标识列中,而不是使用系统生成的值。

欲了解更多信息