Я пытаюсь создать несколько простых таблиц. У меня есть одна таблица со списком членов, а другая связана со списком членов через внешний ключ memberNo. Могу ли я ограничить вторую таблицу, например, чтобы отдельный внешний ключ появлялся только три раза?
CREATE TABLE members(memberNo varchar(6) NOT NULL,
fname varchar(10),
lname varchar(10),
PRIMARY KEY (memberNo));
CREATE TABLE activities(actNo varchar(6) NOT NULL,
type varchar(30),
memberNo varchar(6) NOT NULL,
PRIMARY KEY(actNo),
FOREIGN KEY(memberNo) REFERENCES Members(memberNo),
%CHECK(count(memberNo) < 6));
Вероятно, это очень просто, но я не могу найти решение, поэтому, вероятно, задаю вопрос неправильно. Я знаю, что не хочу, чтобы memberNo был УНИКАЛЬНЫМ в таблице действий, но чтобы ему было разрешено повторяться только ограниченное количество раз.
В MySQL нет действительно простого способа сделать это. Вот два метода использования триггеров.
Один из методов состоит в том, чтобы триггер insert
подсчитывал количество строк в activities
для данного члена и не разрешал обновления, превышающие пороговое значение.
Второй метод - изменить members
так, чтобы в нем был столбец с количеством действий - обычно требуются триггеры на insert
, delete
и, возможно, update
в activities
. Это значение затем можно использовать в триггере insert
для действий для проверки значения.
Возможны два других метода. Если все ваши изменения данных заключены в хранимые процедуры, вы можете реализовать их в хранимых процедурах, а не в базе данных. При разработке систем я часто использую этот подход, но вы должны быть очень осторожны, чтобы контролировать все модификации.
Наконец, если вы хотите разрешить только два или три действия, у вас может быть отдельный столбец в элементах, ссылающийся на каждое из них. Я не в восторге от такого подхода, но он удовлетворяет потребность в небольшом количестве мероприятий на одного участника.
Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не название конкретного продукта базы данных. Добавьте тег для продукта базы данных, который вы используете
postgresql
,oracle
,sql-server
,db2
, ...