【问题标题】:Default value of column (when value is set to NULL) equal to other column列的默认值(当值设置为 NULL 时)等于其他列
【发布时间】:2013-03-24 21:05:51
【问题描述】:

我的 SQL 定义的一部分(针对):

CREATE TABLE activities (
  id  BIGINT GENERATED BY DEFAULT AS IDENTITY,
  group_id  BIGINT NOT NULL
  CONSTRAINT pk_activities PRIMARY KEY (id)
);

insert期间的场景是:

  • id 是自动生成/自动递增的,
  • group_id 指定时(非空)设置为给定值,
  • group_id 未指定时设置为刚刚生成的id 的值

我的目标是 (用于测试)。

可以这样做吗?

【问题讨论】:

标签: hsqldb postgresql hsqldb sql database postgresql hsqldb


【解决方案1】:

您不能将默认值设置为另一列的默认值。

但是,您可以创建一个TRIGGER 来完成此任务。

这是 PostgreSQL 的示例。如果NULLINSERTUPDATE之前,它会自动将column替换为anothercolumn

CREATE OR REPLACE FUNCTION mytable_fn()
RETURNS trigger AS
$body$
BEGIN
    IF NEW.column ISNULL THEN
        NEW.column := NEW.anothercolumn;
    END IF;
    RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql';

CREATE TRIGGER mytable_trigger
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE mytable_fn();

【讨论】:

  • 触发器是通用的/标准化的吗?你能提供一个相关的例子吗?
  • @JohanesMatian:据我所知,大多数现代数据库(PostgreSQL、MySQL、Oracle、MSSQL)都实现了触发器,但语言不一定兼容。不过,我对 hsqldb 了解不多。我已经更新了我的答案,以提供 Postgres 的示例。
  • @JohanesMatian: hsqldb supports triggers 也是如此。语言略有不同,但我认为您应该能够为hsqldb 编写类似的触发器
【解决方案2】:

这可以使用触发器来完成,或者如果您不想使用触发器,则在选择这样的行时处理 NULL:

SELECT id, isnull(group_id, id) group_id FROM activities;

【讨论】:

  • ISNULL() 不是标准 SQL 函数。例如,PostgreSQL 不支持它。此外,这不会更改相关字段的值
  • HSQLDB 支持在不同数据库引擎中使用的所有 IFNULL、ISNULL、NULLIF、COALESCE 等变体。请参阅指南。
猜你喜欢
  • 2016-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-15
  • 2013-03-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-21
相关资源
最近更新 更多