我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
当前回答
在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。
其他回答
试试这个命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
尝试使用创建表的同一个db -用户。
如果您想在序列中使用数字,请使用以下内容定义一个新序列
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);
串行是自动生成唯一值的旧方法,它不是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将使用这个值来插入到标识列中,而不是使用系统生成的值。
获取更多信息。
在PgAdmin上执行的步骤:
创建序列//如果表存在最后一个id 添加这个序列到主键,table - properties - columns - column_id(主键)edit - Constraints -添加nextval(' sequunence_title '::regclass)到 字段default。
在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。