Обеспечение полного участия в отношениях «один ко многим» в односторонней организации?|SQL - PullRequest
0 голосов
/ 26 сентября 2018

Я нахожусь в процессе перевода следующей диаграммы ER в код SQL:

enter image description here

Чтобы смоделировать это, я создал таблицу для каждого соответствующегосущность, а также таблица для отношений.Моя проблема заключается в моделировании отношения один-ко-многим, а также в применении ограничения общего участия для сущности Medical Test .

Я начинаю с сущности Person :

-- Person Entity
CREATE TABLE Person (
uniquePersonID CHAR(10) NOT NULL,
gender CHAR(1),         -- "M" = Male | "F" = Female
firstName VARCHAR(30),
lastName VARCHAR(30),
dateOfBirth DATE,
PRIMARY KEY (uniquePersonID));

Я присваиваю идентификатор как NOT NULL, потому что это первичный ключ.

Затем следует Медицинский тест сущность:

CREATE TABLE MedicalTest (
testID CHAR(10) NOT NULL,
testFee REAL,
testName VARCHAR(30),
PRIMARY KEY (testID));

Теперь начинается та часть, с которой я борюсь, отношения делает тест :

-- Does Test Relationship
CREATE TABLE DoesTest (
uniquePersonID CHAR(10) NOT NULL,
testID CHAR(10),
testDate DATE,
result VARCHAR(100),
PRIMARY KEY (testID),
FOREIGN KEY (uniquePersonID) REFERENCES Person,
FOREIGN KEY (testID) REFERENCES MedicalTest);

Из того, что я узнал, если, например, я хочу сделать Медицинский тест с полным участием, я делаю Пациент Первичный ключ НЕ НЕДЕЙСТВИТЕЛЬНЫМ.Для моделирования «один ко многим» я назначаю первичный ключ объекту с одной стороны.Однако, когда я запускаю файл, он говорит мне, что testID в таблице отношений не может допустить значения NULL.Однако, исходя из того, чему меня учили, если я назначу его НЕ ПУСТО (NULL), это заставит его иметь полное участие, чего я пытаюсь избежать.

Ошибка:

CREATE TABLE DoesTest ( testDate DATE, result VARCHAR(100), testID CHAR(10), 
uniquePersonID CHAR(10) NOT NULL, PRIMARY KEY (testID), FOREIGN KEY 
(uniquePersonID) REFERENCES Person, FOREIGN KEY (testID) REFERENCES 
MedicalTest)
DB21034E  The command was processed as an SQL statement because it was not a 
valid Command Line Processor command.  During SQL processing it returned:
SQL0542N  The column named "TESTID" cannot be a column of a primary key or 
unique key constraint because it can contain null values.  SQLSTATE=42831

1 Ответ

0 голосов
/ 26 сентября 2018

Первичный ключ таблицы НИКОГДА не принимает нулевые значения и всегда должен включать ограничение NOT NULL.

Он должен работать, если вы измените свой первичный ключ на:

CREATE TABLE DoesTest (
  testDate DATE,
  result VARCHAR(100),
  testID CHAR(10) NOT NULL, -- added NOT NULL here.
  uniquePersonID CHAR(10) NOT NULL,
  PRIMARY KEY (testID),
  FOREIGN KEY (uniquePersonID) REFERENCES Person,
  FOREIGN KEY (testID) REFERENCES MedicalTest
);

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...