【问题标题】:How to use auto increase primary key using PyGreSQL and PostgreSQL如何使用 PyGreSQL 和 PostgreSQL 自动增加主键
【发布时间】:2012-07-17 03:30:36
【问题描述】:

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

有什么建议吗?谢谢。

【问题讨论】:

    标签: python postgresql pygresql


    【解决方案1】:

    你应该省点麻烦,用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 类型确实确保当列消失时序列将被删除。如果您不设置序列的所有者,您可能会在数据库中留下未使用的序列。

    【讨论】:

      【解决方案2】:

      您忘记将序列分配给列。

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

      【讨论】:

      • CREATE TABLE dember (id INT NOT NULL DEFAULT nextval('dember_id_seq'), did VARCHAR(255) DEFAULT NULL, dnix VARCHAR(255) DEFAULT NULL, durl TEXT DEFAULT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, 修改 TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, status BOOLEAN NOT NULL, dnickname VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id));
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-30
      • 2011-02-26
      • 2012-07-31
      • 2018-06-05
      • 2011-12-04
      • 1970-01-01
      相关资源
      最近更新 更多