web-dev-qa-db-ja.com

複数の列での複合一意制約の作成

これは私のモデルです:

_class User {...}
class Book {
  User author;
  int number;
}
_

すべての書籍番号は著者ごとに1から始まり、上向きに増加します。したがって、John GrishamのBooks 1,2,3、George MartinのBook 1..5などがあります。

Bookに設定できる一意の制約はありますか。これにより、同じ著者が同じ番号の本を2つ持っていないことを保証できますか? @Column(unique = true)と似ていますが、制約は_Author X number_?の複合にのみ適用されます。

52
ripper234

使用する - @UniqueConstraint

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

以前にテーブルを作成する場合、削除する必要があります。一意のキーは既存のテーブルに追加されません。

4

@axtavtが回答したように、@UniqueConstraintアプローチ。しかし、既存のテーブルの場合、複数の可能性があります。常にではありませんが、一般的にSQLExceptionを受け取る場合があります。その理由は、複合一意キーと競合している既存のデータがテーブルにある可能性があるためです。したがって、これを回避するためにできることは、既存のデータがすべてComposite Unique Keyで問題ないかどうかを最初に手動で確認することです(単純なSQLクエリを使用して)。そうでない場合は、もちろん、違反の原因となっているデータを削除します。 (別の方法は、既存のテーブル全体を削除することですが、重要なデータが含まれていない場合にのみ使用できます)。

0
Arman