【问题标题】:Enforcing Total Participation in a One-To-Many Relationship on the one sided entity? | SQL在一方实体上强制完全参与一对多关系? | SQL
【发布时间】:2018-09-26 15:26:45
【问题描述】:

我正在将以下 ER 图翻译成 SQL 代码:

为了对此进行建模,我为每个实体创建了一个表,并为关系创建了一个表。我的问题是对一对多关系进行建模以及对 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));

我将 ID 分配为 NOT NULL,因为它是主键。

接着是医学测试实体:

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

现在是我苦苦挣扎的部分,Does Test 关系:

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

据我所知,例如,如果我想让 Medical Test 完全参与,我将 Patient 主键设为 NOT NULL。为了建模一对多,我将主键分配给一侧实体。但是,当我运行该文件时,它告诉我关系表中的 testID 不能允许 NULL 值。但是,根据我所学到的知识,如果我将其指定为 NOT 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

【问题讨论】:

  • 什么是数据库引擎? DB2? Oracle、PostgreSQL、MySQL 等
  • 引擎是 DB2。
  • 使用 DECIMALDECFLOAT 表示货币金额,而不是您在此处使用的二进制浮点数 testFee REAL
  • 你有很多可以为空的列。 MedicalTest 没有TestName 确实有效(例如)。 Aso TestNames 不应该是唯一的吗?
  • P.S.如果你想保持你的混合大小写命名标准,你需要双引号你所有的标识符

标签: sql database db2


【解决方案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 中有相应的行。那些会模拟尚未接受测试的患者,这是完全正常的。

【讨论】:

  • 完全参与,我的意思是医学测试必须与患者有关系,用较粗的黑线表示,箭头确定它是多对一的。通过强制 testID 也为 NOT NULL,我被告知这使得 Patient 实体也完全参与,这是我不希望发生的事情。
  • 否,在表中添加 NOT NULL DoesTest 不会强制要求患者完全参与。 uniquePersonId CHAR(10) NOT NULL 将强制测试属于患者,但不会强制患者进行测试。我想这就是你想要的。
  • 如果分配 NOT NULL 不会要求完全参与,那会怎样?因为它是医学测试所必需的。另外,我是否正确表示了一对多关系?
猜你喜欢
  • 2011-01-28
  • 1970-01-01
  • 2016-07-01
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2016-01-13
  • 2021-07-17
  • 1970-01-01
相关资源
最近更新 更多