Как ограничить таблицу 5 записями с определенной комбинацией полей - PullRequest
0 голосов
/ 26 апреля 2018

Я использую MS Access 2016.

Предположим, у меня есть таблица ученика, таблица предмета (т. Е. География, история и т. Д.) И таблица StudentSubject, в которой записаны предметы, выбранные каждым учеником.

StudentSubject содержит StudentId и SubjectId в качестве внешних ключей.

Ни один студент не должен выбирать более 5 предметов.

Есть ли способ определить правило проверки для таблицы таким образом, чтобы данный StudentId не появлялся в таблице StudentSubject более 5 раз?

Я мог бы ввести в действие нарушение, введя дополнительную таблицу, но, если возможно, я бы хотел этого избежать.

Я также хочу определить ограничение на уровне таблицы, а не использовать код vba, который вызывается при вставке записи через форму. Доступ, насколько я знаю, не имеет такой вещи, как триггеры, как это было бы в системе SQL.

1 Ответ

0 голосов
/ 26 апреля 2018

Вы можете использовать ограничение CHECK для ограничения возможностей:

ALTER TABLE StudentSubject 
ADD CONSTRAINT Max5Subjects 
CHECK(
    NOT EXISTS(
        SELECT 1 
        FROM StudentSubject 
        GROUP BY StudentID 
        HAVING Count(StudentID) > 5
    )
)

Обратите внимание, что это может немного замедлить ввод данных, особенно если StudentID не проиндексирован.

Проверка ограничений должна выполняться либо в режиме, совместимом с ANSI 92, либо с использованием ADO (например, с использованием CurrentProject.Connection.Execute). Подробнее здесь

Чтобы выполнить его с помощью ADO, вы можете просто использовать эту единственную строку в ближайшем окне:

CurrentProject.Connection.Execute "ALTER TABLE StudentSubject ADD CONSTRAINT Max5Subjects CHECK(NOT EXISTS( SELECT 1 FROM StudentSubject GROUP BY StudentID HAVING Count(StudentID) > 5))"

Кроме того, имейте в виду, что если каким-либо образом есть записи, которые нарушают ограничение (например, потому что они присутствовали до добавления ограничения), ваша таблица будет заблокирована полностью.

...