簡體   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