我在PostgreSQL中有一个包含22列的表,我想添加一个自动增量主键。
我尝试创建一个名为id
的BIGSERIAL类型的列,但pgadmin回复时出现错误:
ERROR: sequence must have same owner as table it is linked to.
有谁知道如何解决这个问题?如何在PostgreSQL中添加创建自动递增主键而无需再次重新创建表?
答案 0 :(得分:270)
尝试此命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
尝试使用与创建表格的用户相同的数据库用户。
答案 1 :(得分:244)
第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)然后通过右键单击序列 - >添加序列。 添加新序列。 如果表格中没有数据,请按顺序保留序列,不要进行任何更改。只需保存它。 如果存在现有数据,请将主键列中的最后一个或最高值添加到“定义”选项卡中的“当前”值,如下所示。
3)最后,将行nextval('your_sequence_name'::regclass)
添加到主键中的默认值,如下所示。
答案 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上执行此操作的步骤: