【问题标题】:How to CREATE UNIQUE INDEX ... WHERE another_field IS NULL in H2如何创建唯一索引 ... H2 中的另一个字段为 NULL
【发布时间】:2022-01-04 10:11:41
【问题描述】:

我在做

CREATE UNIQUE INDEX index_name ON car (license_plate) WHERE deleted IS NULL

用例是软删除:

  1. 我们为汽车创建一行,将已删除设置为 null 并且 license_plate 是唯一的
  2. 现在我们不应该被允许进入其他车牌相同的汽车
  3. 我们通过将已删除的内容设置为软删除汽车
  4. 现在我们应该被允许进入具有相同牌照的新车。

这适用于 postgres(在测试容器中运行),但不适用于 H2 或 HSQLDB。有没有办法用 H2 或任何其他我可以从 Java 以编程方式创建的内存数据库实现相同的目标?

【问题讨论】:

    标签: sql h2


    【解决方案1】:

    见:PostgreSQL: Create an index to quickly distinguish NULL from non-NULL values

    CREATE TABLE public.car (
        id int4 NOT NULL GENERATED BY DEFAULT AS IDENTITY,
        licenseplate varchar(20) NOT NULL,
        deleted timestamp NULL
    );
    CREATE UNIQUE INDEX car_licenseplate_idx ON public.car USING btree (licenseplate) WHERE (deleted IS NULL);
    

    我确实创建了字段 deleted 作为时间戳,因此当记录被“软”删除时,您可以添加一个触发器来更新删除 now()

    DBFIDDLE

    【讨论】:

    • 但是 Postgres 已经可以工作了,这不是问题所在。问题是对 H2 做同样的事情。
    • 在 SQLite 中也是如此,我没有 H2(很抱歉误读了您的问题)
    猜你喜欢
    • 2020-05-16
    • 2020-06-28
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 2021-04-30
    相关资源
    最近更新 更多