如何在PostgreSQL中设置自动增量主键?
我在PostgreSQL有22列的表,我想添加一个自动增量主键。
我试图创build一个名为BIGSERIALtypes的id
列,但是pgadmin回应了一个错误:
ERROR: sequence must have same owner as table it is linked to.
有谁知道如何解决这个问题? 如何在PostgreSQL中添加一个自动递增的主键而不重新重新创build表?
试试这个命令:
ALTER TABLE your_table ADD COLUMN key_column BIGSERIAL PRIMARY KEY;
用与创build表相同的DB用户来尝试。
自动递增postgresql中的主键:
第1步,创build你的表格:
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步,从你的表中select*
el@voyager$ psql -U pgadmin -d kurz_prod -c "select * from epictable"
第四步,解释输出:
mytable_key | moobars | foobars -------------+-----------------------+------------ 1 | delicious moobars | 2012-05-01 2 | world wide interblags | 2012-05-02 (2 rows)
注意到mytable_key列已被自动增加。
普罗蒂普:
您应该始终在表上使用主键,因为postgresql在内部使用散列表结构来提高插入,删除,更新和select的速度。 如果主键列(这是强制唯一的和非空的)是可用的,则它可以依赖于为散列函数提供唯一的种子。 如果没有主键列可用,则散列函数变得效率低下,因为它select其他一组列作为键。
在postgresql中使用自定义序列创build一个自动递增主键:
第1步,创build你的序列:
create sequence splog_adfarm_seq start 1 increment 1 NO MAXVALUE CACHE 1; ALTER TABLE fact_stock_data_detail_seq OWNER TO pgadmin;
第2步,创build你的表
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'), 'Ethics is a scam created by poor people to manipulate rich people.' );
第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 | Ethics is a scam created by poor people to manipulate rich people. (3 rows)
这两行的键从1开始,按序列定义的那样递增1。
奖金Elite ProTip:
程序员讨厌打字,inputnextval('splog_adfarm_seq')
很烦人。 你可以改为inputDEFAULT
作为参数,就像这样:
insert into splog_adfarm values ( DEFAULT, 'Sufficient intelligence to outwit a thimble.' );
为了上面的工作,你必须在splog_adfarm表上定义该键列的默认值。 哪个更漂亮
如果你想在pgadmin中做到这一点,那就容易多了。 看来在postgressql中,要为列添加自动增量,我们首先需要创build一个自动增量序列并将其添加到所需的列。 我喜欢这个。
1)首先你需要确保你的表有一个主键。 还要保持主键的数据types为bigint或smallint。 (我用bigint,找不到其他地方的其他答案中提到的称为serial的数据types)
2)然后通过右击序列添加一个序列 – > 添加新的序列 。 如果表格中没有数据,请保持原样,不要做任何改变。 只要保存它。 如果存在数据,则将主键列中的最后一个或最高值添加到定义选项卡中的当前值,如下所示。
3)最后,将nextval('your_sequence_name'::regclass)
行添加到主键中的默认值,如下所示。
确保序列名称在这里是正确的。 这是所有和自动增量应该工作。
也许我有点迟到回答这个问题,但我正在做这个问题在我的工作:)
我想写列'a_code'= c1,c2,c3,c4 …
首先,我打开了名为ref_id
和typesserial
。 然后我用这个命令解决了我的问题:
update myschema.mytable set a_code=cast('c'||"ref_id" as text)