我在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不支持这种配置?
答案 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
总是插入默认值,这将是不可能的(或者,至少,不必要地复杂化)。