【问题标题】:Inserting NULL value to TIMESTAMP fields in postgreSQL将 NULL 值插入到 postgreSQL 中的 TIMESTAMP 字段
【发布时间】: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 提供实际的 Postgres CREATE TABLE 语句。

标签: mysql postgresql


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您不想将默认设置为当前时间戳,可以考虑使用-infinity 或infinity,这样您总能找到缺少日期时间的数据

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2019-12-02
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-03
      相关资源
      最近更新 更多