2017-10-16 36 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总是插入默认值,则这是不可能的(或者至少不必要的复杂)。