如何使用PyGreSQL和PostgreSQL自动增加主键

时间:2012-07-17 03:30:37

标签: python postgresql pygresql

我的PostgreSQL中有一个表:

CREATE SEQUENCE dember_id_seq INCREMENT BY 1 MINVALUE 1 START 1;
CREATE TABLE dember (id INT NOT NULL, did VARCHAR(255) DEFAULT NULL, dnix VARCHAR(255) DEFAULT NULL, durl TEXT DEFAULT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, status BOOLEAN NOT NULL, dnickname VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id));

当我想插入记录时,我使用以下代码:

import pg
db = pg.DB(....)
db.insert('dember',{'did':did,'dnix':dnix,'durl',durl,'created',now, 'modified':now, 'status':'true','dnickname':nickname'})

然后插入代码不起作用,我收到以下错误:

  

pg.ProgrammingError:错误:列“id”中的空值违反非空约束

看起来我必须将{'id':number}添加到值字典中。

有什么建议吗?感谢。

2 个答案:

答案 0 :(得分:3)

您应该省去一些麻烦并使用serial代替int

  

数据类型serialbigserial不是真正的类型,而只是创建唯一标识符列的符号方便(类似于其他一些数据库支持的AUTO_INCREMENT属性)。

所以说:

create table t (
    id serial not null primary key
    -- ...
)

会将id创建为integer列,为其创建序列,将默认值id设置为序列中的下一个值,并将序列的所有者设置为id列;最后一点很重要,暗示

ALTER SEQUENCE t_id_seq OWNED BY t.id;

serial类型可确保在列消失时删除序列。如果您没有设置序列的所有者,您可以在数据库中悬挂未使用的序列。

答案 1 :(得分:1)

您忘记将序列分配给列。

CREATE TABLE dember (id INT NOT NULL DEFAULT nextval('dember_id_seq'), ...