我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
我在PostgreSQL中有一个有很多列的表,我想添加一个自动递增的主键。
我试图创建一个名为BIGSERIAL类型id的列,但pgadmin响应一个错误:
错误:序列必须与它所链接的表具有相同的所有者。
有人知道如何解决这个问题吗?我如何在PostgreSQL中添加或创建一个自动递增的主键而不重新创建表?
当前回答
在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,找不到一个数据类型称为串行,如在其他地方提到的其他答案)
2)然后添加序列右击序列->添加新序列。 如果表中没有数据,保持序列不变,不要做任何更改。保存它。 如果有现有数据,将主键列中的最后一个或最大值添加到定义选项卡中的Current值,如下所示。
3)最后,将行nextval('your_sequence_name'::regclass)添加到主键的默认值中,如下所示。
确保这里的序列名称是正确的。这是所有和自动增量应该工作。
在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表上的键列定义一个默认值。哪个更漂亮。
如果您想在序列中使用数字,请使用以下内容定义一个新序列
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);
试试这个命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
尝试使用创建表的同一个db -用户。
您可以使用下面的代码自动递增
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
)