【发布时间】: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。
-
使用
DECIMAL或DECFLOAT表示货币金额,而不是您在此处使用的二进制浮点数testFee REAL -
你有很多可以为空的列。
MedicalTest没有TestName确实有效(例如)。 AsoTestNames 不应该是唯一的吗? -
P.S.如果你想保持你的混合大小写命名标准,你需要双引号你所有的标识符