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」のnull値が非null制約に違反しています

{'id':number} を値辞書に追加する必要があるようです。

助言がありますか?ありがとう。

4

2 に答える 2

3

トラブルを避けて、serial代わりに使用する必要がありますint

データ型serialbigserialは真の型ではありませんが、一意の識別子列を作成するための表記上の便宜にすぎません(他のデータベースでサポートされているAUTO_INCREMENTプロパティと同様)。

だから言って:

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

列として作成し、そのシーケンスを作成し、デフォルト値をidシーケンスの次の値に設定し、シーケンスの所有者を列に設定します。最後のビットは重要です、暗黙のintegeridid

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 に答える