如何在PostgreSQL中设置自动增量主键?
我在PostgreSQL中有一个22列的表,我想添加一个自动递增主键。
我试图创建一个名为BIGSERIAL类型的id
列,但pgadmin回应时显示错误:
ERROR: sequence must have same owner as table it is linked to.
有谁知道如何解决这个问题? 如何添加一个在PostgreSQL中创建自动递增主键而不重新重新创建表?
试试这个命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
使用与创建表相同的DB用户来尝试它。
自动递增postgresql中的主键:
第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内部使用散列表结构来提高插入,删除,更新和选择的速度。 如果主键列(它是强制唯一且非空的)可用,则可以依赖它来为散列函数提供唯一的种子。 如果没有主键列可用,则散列函数变得效率低下,因为它选择其他一组列作为键。
在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。
奖金Elite ProTip:
程序员讨厌打字,输入nextval('splog_adfarm_seq')
很烦人。 您可以改为为该参数键入DEFAULT
,如下所示:
insert into splog_adfarm values (
DEFAULT,
'Sufficient intelligence to outwit a thimble.'
);
为了上述工作,您必须为splog_adfarm表上的该键列定义默认值。 哪个更漂亮?
链接地址: http://www.djcxy.com/p/95203.html