繁体   English   中英

在两个非空字段上添加唯一约束

[英]Add unique constraint on two not null fields

我有一个包含两个字段的实体:

@ManyToOne(fetch = FetchType.LAZY, optional = true)
private Organization organization;

@Column(length = 15)
private String ref;

我想在organization上添加唯一键并ref该唯一键仅在organizationref都不为空时才有效。

例如,当我插入两条记录时:

organization = 1, ref = 'R1'

organization = 1, ref = 'R1'

这将产生约束冲突,到目前为止,我对这种情况没有任何疑问。

当我插入两条记录时:

organization = null, ref = null

organization = null, ref = null

这不会产生约束违规,到目前为止,我对这种情况也没有问题。

我遇到的问题是在这种情况下:

organization = 1, ref = null

organization = 1, ref = null

要么

organization = null, ref = 'R1'

organization = null, ref = 'R1'

这两种情况都产生了约束冲突,这是我不希望的,因为我只希望唯一的约束在只有organizationref都不为空的情况下才有效。

这就是我声明唯一约束的方式:

@Table(uniqueConstraints = {
        @UniqueConstraint(columnNames = { "organization", "ref" })
})

我该如何解决。

PS:我正在使用Oracle 12c。

编辑:

  • 字段organizationref都可以为空。 JPA

  • 我声明的@UniqueConstraint批注将生成SQL代码:

    在“ USERNAME”上创建唯一索引“ USERNAME”。“ UK_TABLENAME_1”。“ TABLENAME”(“ organization”,“ ref”)

您需要为此创建一个基于函数的索引。

CREATE UNIQUE INDEX uidx_my_table ON my_table
  (CASE WHEN organization IS NOT NULL AND ref IS NOT NULL
        THEN organization || ref 
   END);

Oracle对于唯一索引颇为奇怪:

唯一索引升序允许多个NULL值。 但是,在降序唯一索引中,多个NULL值被视为重复值,因此是不允许的。

因此,您可以使用唯一索引来处理此问题:

create unique index unq_t_organization_ref on t(organization, ref);

索引应忽略唯一值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM