在单边实体上强制完全参与一对多关系? | SQL

时间:2018-09-26 15:26:45

标签: sql database db2

我正在将以下ER图转换为SQL代码:

enter image description here

为此建模,我为每个实体创建了一个表,并为关系创建了一个表。我的问题是对一对多关系进行建模,并对医学测试实体实施总参与约束。

我从 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));

我将ID分配为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);

据我了解,例如,如果我想让医学测试完全参与,那么我将 Patient 主键设置为NOT NULL。为了建模一对多,我将主键分配给一侧实体。但是,当我运行该文件时,它告诉我关系表中的 testID 不允许使用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 :(得分:1)

表的主键从不接受空值,并且应始终包含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中有相应的行。这些将为尚未参加测试的患者建模,这完全正常。