2012-07-17 78 views
0

我在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: ERROR: null value in column "id" violates not-null constraint

看來,我必須添加{「ID」:數}到值字典。

有什麼建議嗎?謝謝。

回答

1

您忘了將序列分配到列。

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

感謝它現在解決。 – 2012-07-17 03:34:37

+0

CREATE TABLE dember(id INT NOT NULL DEFAULT nextval('dember_id_seq'),VARCHAR(255)DEFAULT NULL,dnix VARCHAR(255)DEFAULT NULL,durl TEXT DEFAULT NULL,創建TIMESTAMP(0)WITHOUT TIME ZONE NOT NULL,modified TIMESTAMP(0)WITHOUT TIME ZONE NOT NULL,狀態BOOLEAN NOT NULL,dnickname VARCHAR(255)DEFAULT NULL,PRIMARY KEY(id)); – 2012-07-17 03:34:46

2

您應該保存自己的一些麻煩和使用serial代替int

The data types serial and bigserial are not true types, but merely a notational convenience for creating unique identifier columns (similar to the AUTO_INCREMENT property supported by some other databases).

說着:

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

將創建id作爲integer列,因爲它創建序列,將缺省值id設置爲序列中的下一個值,並將序列的所有者設置爲id欄目;最後一點是很重要的,隱含的

ALTER SEQUENCE t_id_seq OWNED BY t.id; 

一個serial類型確實保證了當列消失的順序將被丟棄。如果你沒有設置序列的所有者,你可以在數據庫中留下未使用的序列。

相關問題