[英]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
该唯一键仅在organization
和ref
都不为空时才有效。
例如,当我插入两条记录时:
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'
这两种情况都产生了约束冲突,这是我不希望的,因为我只希望唯一的约束在只有organization
和ref
都不为空的情况下才有效。
这就是我声明唯一约束的方式:
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = { "organization", "ref" })
})
我该如何解决。
PS:我正在使用Oracle 12c。
字段organization
和ref
都可以为空。 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.