Как добавить ограничение к этой таблице с помощью sql? - PullRequest
1 голос
/ 11 ноября 2019

У меня есть таблица с именем Student, и в этой таблице есть 2 столбца Student_Id и Is_Honor_Student (это флаговый столбец либо 0, либо 1 для представления true / false)

У меня есть еще одна таблица с именем Honor_Student, в которой есть 2 столбца Student_Id и Class_Id, а также некоторые дополнительные столбцы, не относящиеся к этому вопросу.

Конечно, третья таблица Class, которая имеет Class_Id column.

И, наконец, таблица с именем Enrollment, в которой Student_Id и Class_Id ссылаются на таблицы Student и Class.

Хорошо, так что я хочу, чтобыограничение для проверки того, что если студент является студентом с отличием, то в таблице Honor_Student должна существовать запись ДО того, как мне разрешат вставить запись в таблицу Enrollment. Если студент не является студентом чести, то это ограничение не применяется. Как я могу это сделать?

Кстати, я использую jdbc liquibase, поэтому я был бы очень признателен за любой пример использования liquibase: https://www.liquibase.org/documentation/changes/add_check_constraint.html

Но для начала я был бы очень признателенв правильном направлении, даже используя Alter Table или какой-то другой подход, который может сделать это возможным ... ТЕХНИЧЕСКИ Я думаю, что я ищу "условное" внешнее ограничение ключа с Student_Id и Class_Id, ссылающимися на таблицу Honor_Student, нотолько если это студент чести ... это немного странно.

1 Ответ

0 голосов
/ 11 ноября 2019

AFAIK Мне кажется, я ищу "условное" ограничение внешнего ключа , которое может оказаться невозможным.

Вы можете использовать Функция определения пользователя и Условная проверка Ограничения:

Например:

UDF:

CREATE FUNCTION IsHonarStudentExist (
    @Student_Id INT
)
RETURNS bit
AS
BEGIN
    IF EXISTS (SELECT * FROM Honor_Student WHERE Student_Id = @Student_Id)
        return 1
    return 0
END

ПРОВЕРКА Ограничения:

ALTER TABLE Student WITH CHECK
ADD check (
    (Is_Honor_Student= 1 AND IsHonarStudentExist (Student_Id) = 1)
    OR
    (Is_Honor_Student= 0)

Примечание. Синтаксис, тип данных и запрос могут различаться в зависимости от вашей базы данных. Выше кода это только один подход.

...