【发布时间】:2018-03-27 17:40:31
【问题描述】:
我在 MySQL 中有以下 DB 模式,我已经使用 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 不支持此配置?
【问题讨论】:
-
请从标签中删除 postgres。如果您想要默认值,请跳过列表中的列 - 如果您明确指定
NULL- 它将惰性 NULL,而不是DEFAULT -
allow null for
created和updated字段,您正在尝试将 null 插入到不可为空的字段中。如果您的插入查询没有此字段,则只有默认值才会插入 -
@VaoTsun 为什么要删除 postgres 标签?这是mysql支持的。此查询是从 ORM 库生成的。
-
Vao Tsun 的困惑可能是您说过“我有这个 Postgres 表定义”,但您给出的定义是 MySQL 语法(反引号标识符、
ENGINE = InnoDB等)。我已经编辑了这个问题,说这是您复制的 MySQL 版本,但您可能希望 edit 提供实际的 PostgresCREATE TABLE语句。
标签: mysql postgresql