在多列上创建复合唯一约束

Posted

技术标签:

【中文标题】在多列上创建复合唯一约束【英文标题】:Creating a composite Unique constraints on multiple columns 【发布时间】:2012-01-04 23:11:16 【问题描述】:

这是我的模型:

class User ...
class Book 
  User author;
  int number;

每本书的编号从每位作者 1 开始,然后向上递增。所以我们会有 John Grisham 的 Books 1,2,3,George Martin 的 Book 1..5 等等......

我可以在Book 上设置一个独特的约束条件,以保证我们没有两本同一作者的相同编号的书吗?类似于@Column(unique = true),但约束只适用于Author X number的复合?

【问题讨论】:

How to introduce multi-column constraint with JPA annotations?的可能重复 【参考方案1】:

使用@UniqueConstraint:

@Table(
    uniqueConstraints=
        @UniqueConstraint(columnNames="author_id", "number")
)
@Entity
class Book extends Model 
   @ManyToOne
   @JoinColumn(name = "author_id")
   User author;
   int number; 
 

【讨论】:

如何让作者和数字@id 像 FK 一样?? 对于多个复合 uniqueConstraints,语法为 @Table(uniqueConstraints = @UniqueConstraint(columnNames = "field1", "field2", "field3" ), @UniqueConstraint(columnNames = " field4", "field5")) ) 添加这个唯一约束后,当我部署应用程序时,hibernate 不再能够创建我的表。你能帮忙吗? 唯一性是针对(productId)列和(serial)列还是针对总共2列(productId,serial)的约束?【参考方案2】:

以前创建表时,需要将其删除。唯一键未添加到现有表中。

【讨论】:

【参考方案3】:

正如@axtavt 已回答的那样,您可以使用@UniqueConstraint 方法。但在现有表的情况下,有多种可能性。并非总是如此,但通常您可能会收到 SQLException。 原因是您的表中可能有一些与复合唯一键冲突的现有数据。因此,为了避免这种情况,您所能做的就是首先手动检查(通过使用简单的 SQL 查询)是否所有现有数据都适合使用复合唯一键。如果不是,当然,删除导致违规的数据。 (另一种方法是删除整个现有表,但只能使用它不包含任何重要数据)。

【讨论】:

以上是关于在多列上创建复合唯一约束的主要内容,如果未能解决你的问题,请参考以下文章

与复合唯一约束的关系(symfony + 学说)

SQL Server 创建约束图解 唯一 主键

CoreData(IOS)多列的唯一约束?

[Oracle]约束(constraint)

复合唯一键约束,其中一列中包含多个空值

在其中一列中具有多个空值的复合唯一键约束