1

我的 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} 添加到值字典中。

有什么建议么?谢谢。

4

2 回答 2

3

您应该为自己省点麻烦并使用serial,而不是int

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

所以说:

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

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

ALTER SEQUENCE t_id_seq OWNED BY t.id;

一个serial类型确实确保当列消失时序列将被删除。如果您不设置序列的所有者,您可能会在数据库中留下未使用的序列。

于 2012-07-17T04:40:24.087 回答
1

您忘记将序列分配给列。

CREATE TABLE dember (id INT NOT NULL DEFAULT nextval('dember_id_seq'), ...
于 2012-07-17T03:32:40.927 回答