2017-10-16 86 views
0
時間戳字段

我在MySQL以下DB模式,這是我在PostgreSQL中使用ORM複製:插入空值在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) 

);

而且我想執行以下查詢

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

這將導致一個錯誤

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

預期的行爲是有當前時間戳的情況下,該值爲NULL,它在MySQL中工作

我正在使用PostgreSQL 10.我是否缺少任何配置,或者在Postgres中不支持?

+0

請從標籤中刪除postgres。如果你想要默認值,跳過列表中的列 - 如果你明確地指定了NULL,那麼你會試圖插入null到null中,而不是DEFAULT –

+0

允許null爲'created'和'updated'字段。不可空字段。如果你的插入查詢沒有這個字段,只有默認會插入 – Bharat

+0

@VaoTsun爲什麼要刪除postgres標籤?這由mysql支持。該查詢是從ORM庫生成的。 – Anuruddha

回答

2

NULL與「default」不一樣。

當您在要插入的值列表中指定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總是插入默認值,則這是不可能的(或者至少不必要的複雜)。