将NULL值插入postgreSQL中的TIMESTAMP字段

时间:2017-10-16 08:46:59

标签: mysql postgresql

我在MySQL中有以下数据库模式,我使用ORM在PostgreSQL中复制了这些模式:

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, 'user@gmail.com', 'pass', 'user', 'user', NULL, NULL);

这会导致错误

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

预期的行为是在值为NULL的情况下获取当前时间戳,并且它在MySQL中有效

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

1 个答案:

答案 0 :(得分:2)

NULL与“默认”不同。

当您在要插入的值列表中指定NULL时,Postgres将尝试在表的该列中插入NULL。如果存在阻止发生这种情况的约束,例如列上的NOT NULL说明符,则插入将失败。

但是,如果未指定该列的值,Postgres将插入该列的默认值,如果未指定默认值,则为NULL

因此,由于您在这两个列上都有DEFAULT个值,因此可以写下:

INSERT INTO users (id, email, password,first_name, last_name)
VALUES (1, 'user@gmail.com', 'pass', 'user', 'user');

这实际上与此相同:

INSERT INTO users (id, email, password,first_name, last_name, created, updated)
VALUES (1, 'user@gmail.com', 'pass', 'user', 'user', CURRENT_TIMESTAMP, CURRENT_TIMESTAMP);

请注意,拥有一个既接受NULL又具有默认值的列是完全合法的。如果试图插入NULL总是插入默认值,这将是不可能的(或者,至少,不必要地复杂化)。