SQL — Создайте ограничение, включающее данные из других таблиц

#sql #oracle #constraints

Вопрос:

Это мой первый раз, когда я использую разработчика SQL, и у меня возникли проблемы с конкретным ограничением. У меня есть эти два стола:

 CREATE TABLE Act  (IDAct VARCHAR2(15),  DNIref VARCHAR2(15),  matchDay DATE,  stadium VARCHAR2(30),  CONSTRAINT Act_PK PRIMARY KEY(IDAct),  CONSTRAINT Act_FK_Referee FOREIGN KEY(DNIref) REFERENCES Referee(DNI),  CONSTRAINT Act_FK_Match FOREIGN KEY(matchDay, stadium) REFERENCES Match(matchDay, stadium) );  CREATE TABLE Match(  matchDay Date,  stadium VARCHAR2(30),  dayHour TIMESTAMP,  DNIref VARCHAR2(15),  CIFVisitor VARCHAR2(15),  CIFHome VARCHAR2(15),  CONSTRAINT Match_CK_HV CHECK (CIFVisitor lt;gt; CIFHome),  CONSTRAINT Match_PK PRIMARY KEY(matchDay, stadium),  CONSTRAINT Match_FK_Referee FOREIGN KEY(DNIref) REFERENCES Referee(DNI),  CONSTRAINT Match_FK_Visitor FOREIGN KEY(CIFVisitor)  REFERENCES Team(CIF),  CONSTRAINT Match_FK_Home FOREIGN KEY(CIFHome)  REFERENCES Team(CIF) );  

И меня попросили добавить следующее ограничение:

Судья, который ведет протокол инцидента, должен судить матч, связанный с этим актом.

Или что-то в этом роде (английский не мой родной язык, и я стараюсь изо всех сил). Как я могу сделать это с помощью действия ALTER TABLE, ДОБАВЛЯЮЩЕГО предложение ОГРАНИЧЕНИЯ? Есть ли какой-нибудь другой способ? Заранее большое спасибо (это мой первый пост).

Комментарии:

1. Ограничение может относиться только к текущим столбцам таблицы и только к значениям строк смородины. Если вам нужно обратиться к другим строкам или таблицам, используйте логику триггера.

2. CONSTRAINT Match_PK PRIMARY KEY(matchDay, stadium) — вы считаете, что 2 матча в день на одном стадионе невозможны? Используйте синтетический пиар и отнесите действие к матчу. В этом случае Act.DNIref столбец является избыточным и должен быть удален.

3. Логика срабатывания, понял. Спасибо, Акина. И о невозможности проведения более одного матча в день на одном стадионе наш учитель сказал нам, чтобы мы реализовали это таким образом, но спасибо за совет.

4. @Akina — на английском языке (и, возможно, на диалектах SQL, с которыми вы более знакомы) date на самом деле означает «дата» (в обычном смысле этого слова). В Oracle это не так — date тип данных oracle всегда включает время суток. Поэтому ваш комментарий о нескольких матчах на одном и том же стадионе в одну и ту же «дату» не имеет смысла. Если вы не знакомы с Oracle, позвольте людям, которые помогают плакатам, у которых есть вопросы Oracle, и не стесняйтесь помогать тем, кто задает вопросы в вашей области специализации.

5. @amelero — Что означает «судья, который ведет протокол инцидента»? Как это связано / отражено в двух таблицах, которые вы опубликовали? В любом случае, если «инциденты» являются деталями совпадения и они записаны в act таблице, то act таблица должна содержать только ссылку на внешний ключ match таблицы, но в противном случае она не должна повторять какую-либо информацию из родительской таблицы. Почему у вас referee act вообще есть в таблице, когда судья полностью определяется матчем (определяется стадионом и датой)?