2017-10-16 6 views
0

にTIMESTAMPフィールドにNULL値を挿入する。)は私がORMを使用してPostgreSQLでは複製されたMySQLで次のDBスキーマ有するpostgreqSQL

CREATE TABLE IF NOT EXISTS users (
id    BIGINT NOT NULL DEFAULT NEXTVAL ('users_seq'), 
email   VARCHAR(255) NOT NULL DEFAULT '', 
password   VARCHAR(255) NOT NULL DEFAULT '', 
last_name  VARCHAR(255) NOT NULL DEFAULT '', 
first_name  VARCHAR(255) NOT NULL DEFAULT '', 
created   TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, 
updated   TIMESTAMP(0) NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (id) 

と、

そして、私はこれは予想される動作は、値がNULLである場合には現在のタイムスタンプを持つことであり、それ

ERROR: null value in column "created" violates not-null constraint 

エラーになり、次のクエリ

INSERT INTO users (id, email, password,first_name, last_name, created, updated) 
VALUES (1, '[email protected]', 'pass', 'user', 'user', NULL, NULL); 

を実行しようとしていますMySQLで動作します

私はPostgreSQL 10を使用しています。構成が不足していますか、これはPostgresでサポートされていませんか?

+0

タグからポストグルを削除してください。デフォルト値が必要な場合は、リストから列をスキップします。明示的に 'NULL'を指定した場合、' DEFAULT'ではなくNULLになります。 –

+0

は 'created'と' updated'フィールドにnullを許可します。 null不可能なフィールド。挿入クエリにこのフィールドがない場合は、デフォルトのみが挿入されます – Bharat

+0

@VaoTsunなぜpostgresタグを削除しますか?これはmysqlでサポートされています。この問合せはORMライブラリから生成されます。 – Anuruddha

答えて

2

NULLは「デフォルト」と同じではありません。

挿入する値リストにNULLを指定すると、PostgresはNULLをテーブルのその列に挿入しようとします。列のNOT NULL指定子のようなエラーが発生しないようにする制約がある場合、挿入は失敗します。

しかし、あなたはにその列の値を指定しない、場合デフォルトが指定されていない場合、Postgresはその列のデフォルト値を挿入、またはNULLます。その結果

、あなたはあなたがこれを書くことができ、これらの列の両方にDEFAULT値持っているので:

INSERT INTO users (id, email, password,first_name, last_name) 
VALUES (1, '[email protected]', 'pass', 'user', 'user'); 

効果的にこれと同じ意味になります。それは完全に合法であることを

INSERT INTO users (id, email, password,first_name, last_name, created, updated) 
VALUES (1, '[email protected]', 'pass', 'user', 'user', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP); 

注意をNULLを受け入れ、既定値を持つ列を持つようにします。 NULLを常に挿入してデフォルト値を挿入しようとすると、これは不可能(または少なくとも不必要に複雑)になります。