我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在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
)
其他回答
试试这个命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
尝试使用创建表的同一个db -用户。
我已经尝试了以下脚本,以成功地自动增加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关键字自动为各自的列创建一个序列。
在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。
如果您希望在pgadmin中执行此操作,则要容易得多。似乎在postgressql中,要向列中添加一个自动增量,我们首先需要创建一个自动增量序列,并将其添加到所需的列中。我确实喜欢这个。
1)首先,你需要确保你的表有一个主键。同时,主键的数据类型保持为大整型或小整型。(我使用了bigint,找不到一个数据类型称为串行,如在其他地方提到的其他答案)
2)然后添加序列右击序列->添加新序列。 如果表中没有数据,保持序列不变,不要做任何更改。保存它。 如果有现有数据,将主键列中的最后一个或最大值添加到定义选项卡中的Current值,如下所示。
3)最后,将行nextval('your_sequence_name'::regclass)添加到主键的默认值中,如下所示。
确保这里的序列名称是正确的。这是所有和自动增量应该工作。
您可以使用下面的代码自动递增
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
)