#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
вообще есть в таблице, когда судья полностью определяется матчем (определяется стадионом и датой)?