我的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}添加到值字典中。
有什么建议吗?感谢。
答案 0 :(得分:3)
您应该省去一些麻烦并使用serial
代替int
:
数据类型
serial
和bigserial
不是真正的类型,而只是创建唯一标识符列的符号方便(类似于其他一些数据库支持的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'), ...