Как гарантировать, что внешний ключ может появляться в таблице только ограниченное количество раз

Я пытаюсь создать несколько простых таблиц. У меня есть одна таблица со списком членов, а другая связана со списком членов через внешний ключ 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 был УНИКАЛЬНЫМ в таблице действий, но чтобы ему было разрешено повторяться только ограниченное количество раз.

Какой СУБД продукт вы используете? «SQL» - это просто язык запросов, а не название конкретного продукта базы данных. Добавьте тег для продукта базы данных, который вы используете postgresql, oracle, sql-server, db2, ...

a_horse_with_no_name 02.05.2018 11:17
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
1
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В MySQL нет действительно простого способа сделать это. Вот два метода использования триггеров.

Один из методов состоит в том, чтобы триггер insert подсчитывал количество строк в activities для данного члена и не разрешал обновления, превышающие пороговое значение.

Второй метод - изменить members так, чтобы в нем был столбец с количеством действий - обычно требуются триггеры на insert, delete и, возможно, update в activities. Это значение затем можно использовать в триггере insert для действий для проверки значения.

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

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

Другие вопросы по теме