[英]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.