Создание составных уникальных ограничений для нескольких столбцов
Это моя модель:
class User {...}
class Book {
User author;
int number;
}
Каждый номер книги начинается с 1 на автора и увеличивается вверх. Итак, у нас будут книги 1,2,3 от Джона Гришама, Книга 1..5 Джорджа Мартина и т.д.
Есть ли уникальное ограничение, которое я могу разместить на Book
, что гарантировало бы, что у нас нет двух книг с одинаковым числом того же автора? Подобно @Column(unique = true)
, но ограничение применяется только к композиту Author X number
?
Ответы
Ответ 1
Используйте @UniqueConstraint
:
@Table(
uniqueConstraints=
@UniqueConstraint(columnNames={"author_id", "number"})
)
@Entity
class Book extends Model {
@ManyToOne
@JoinColumn(name = "author_id")
User author;
int number;
}
Ответ 2
Когда таблица создается ранее, ее необходимо удалить. Уникальный ключ не добавляется в существующую таблицу.
Ответ 3
Как ответил @axtavt, вы можете использовать подход @UniqueConstraint
. Но в случае существующей таблицы есть несколько возможностей. Не всегда, но в целом вы можете получить исключение SQLException. Причина в том, что в вашей таблице могут быть некоторые данные, которые противоречат ключу "Составной уникальный". Поэтому все, что вы можете сделать, чтобы избежать этого, - это сначала вручную проверить (используя простой SQL-запрос), подходят ли все ваши существующие данные с помощью Composite Unique Key. Если нет, конечно, удалите данные, вызывающие нарушение. (Другой способ - удалить всю существующую таблицу, но ее можно использовать только в том случае, если она не содержит важных данных).
Ответ 4
Идеально подходит, когда вы отправляете сообщение для вставки, проблема в том, когда вы получаете полную информацию, введите описание изображения здесь
введите описание изображения здесь
введите описание изображения здесь
как решить, когда я получу полные данные