【问题标题】:Error when trying to set a UNIQUE constraint with DEFAULT NULL in H2 database尝试在 H2 数据库中使用 DEFAULT NULL 设置 UNIQUE 约束时出错
【发布时间】:2020-09-04 09:01:44
【问题描述】:

我想创建一个表,其中的列具有 UNIQUE 约束和 DEFAULT NULL,请参阅下面代码 sn-p 中的 annotation_id 列。这在 Postgres 中有效,但在 H2 中失败,但根据文档,它应该有效 (http://www.h2database.com/html/grammar.html#column_definition)。

这是 DDL 脚本:

CREATE TABLE highlights (
   id bigserial PRIMARY KEY NOT NULL,
   user_ref_id uuid,
   body varchar(10000) DEFAULT NULL,
   annotation_id integer UNIQUE DEFAULT NULL
);

这是我得到的错误:

Syntax error in SQL statement "CREATE TABLE HIGHLIGHTS2 (
   ID BIGSERIAL PRIMARY KEY NOT NULL,
   USER_REF_ID UUID,
   BODY VARCHAR(10000) DEFAULT NULL,
   ANNOTATION_ID INTEGER UNIQUE DEFAULT[*] NULL
)"; expected "NOT, NULL, COMMENT, CHECK, REFERENCES, ,, )"; SQL statement:
CREATE TABLE highlights2 (
   id bigserial PRIMARY KEY NOT NULL,
   user_ref_id uuid,
   body varchar(10000) DEFAULT NULL,
   annotation_id integer UNIQUE DEFAULT NULL
) [42001-200] 42001/42001

根据这里的这个帖子,这应该是可能的:https://groups.google.com/g/h2-database/c/HrYKGMN2LPQ?pli=1

H2 已经在唯一约束中支持 NULL。

我错过了什么?

【问题讨论】:

    标签: null constraints unique h2 default


    【解决方案1】:
    1. 您不能在列的定义中间指定列约束(UNIQUE 或任何其他),这样的约束只能写在列定义的末尾:annotation_id integer DEFAULT NULL UNIQUE

    2. DEFAULT NULL 是一个无意义的子句,如果没有指定其他值,所有可空列都将分配给NULL,无论是否有此子句。这个子句可以去掉。仅当您想指定其他值作为默认值时,才需要使用DEFAULT 子句。

    【讨论】:

    • 感谢 Evgenij,您回答的第二部分为我解决了这个问题。不过,关于第一部分,您能否进一步说明为什么不能在定义中间定义该约束?它是特定于 H2 的吗?它适用于 Postgres。
    • 在 SQL 标准中,列的定义以它的名称开始,紧接着是数据类型或域名;然后可以选择指定默认、身份、生成等子句之一;在它之后可以选择指定列约束;并且排序规则可以可选地在它们之后指定(H2 不支持每列排序规则)。所以它不是 H2 特有的,而是一般规则。但是有些 DBMS 可能有自己的不可移植的扩展,当你在不同的 DBMS 中使用相同的 SQL 时,你不应该依赖它们。
    猜你喜欢
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 2022-09-23
    • 2022-12-10
    • 2017-05-21
    相关资源
    最近更新 更多