我正在尝试在我正在处理的数据库中创建一个层次结构。在我的特定示例中,我正在跟踪联盟成员是教练还是球员。我了解层次结构背后的想法及其工作原理,但尚未编写层次结构(我们从绘制 ERD 开始,无需编码)。现在我不确定我是否试图使问题变得过于复杂,或者只是不明白我需要如何将 ERD 中的内容转换为我的代码。
我的 ERD 中处理这个问题的部分是这样的:
我目前拥有的代码是这样的:
CREATE TABLE MEMBER_BK(
ID_BK INT PRIMARY KEY,
FIRST_NAME_BK VARCHAR(17) NOT NULL,
MIDDLE_NAME_BK VARCHAR(17),
LAST_NAME_BK VARCHAR(17) NOT NULL,
POSITION_BK CHAR(1) NOT NULL, # <P, C>, P = Player, C = Coach
CHECK(POSITION_BK = 'P' OR 'C')
);
CREATE TABLE PLAYER_BK(
MEMBER_ID_BK INT,
MEMBER_POSITION_BK CHAR(1),
JERSEY_NUMBER_BK INT NOT NULL,
PHONE_BK CHAR(14) NOT NULL,
PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
FOREIGN KEY(MEMBER_ID_BK) REFERENCES MEMBER_BK(ID_BK),
#FOREIGN KEY(MEMBER_POSITION_BK) REFERENCES MEMBER_BK(POSITION_BK),
CHECK(MEMBER_POSITION_BK = 'P')
);
CREATE TABLE COACH_BK(
MEMBER_ID_BK INT,
MEMBER_POSITION_BK CHAR(1),
START_YEAR_BK YEAR NOT NULL,
EMAIL_BK VARCHAR(22) NOT NULL,
PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
FOREIGN KEY(MEMBER_ID_BK) REFERENCES MEMBER_BK(ID_BK),
#FOREIGN KEY(MEMBER_POSITION_BK) REFERENCES MEMBER_BK(POSITION_BK),
CHECK(MEMBER_POSITION_BK = 'C')
);
目前,当我未注释掉 MEMBER_POSITION_BK 的 FK 时,我收到 1822 错误代码,这导致我倾向于使这个问题过于复杂化。删除 MEMBER_ID_BK 作为 FK 的分配运行时不会发生错误。在寻找答案的过程中,我确实发现我可能需要涉及索引,但这还不是我遇到的问题。
您可以使用 ID_BK 和 POSITION_BK 的组合键并将其用作参考:
在 id_bk 上添加唯一的 Key,将不允许成员拥有 C 和 P,但我认为在现实生活中,一个成员可以同时拥有这两个位置。
CREATE TABLE MEMBER_BK(
ID_BK INT ,
FIRST_NAME_BK VARCHAR(17) NOT NULL,
MIDDLE_NAME_BK VARCHAR(17),
LAST_NAME_BK VARCHAR(17) NOT NULL,
POSITION_BK CHAR(1) NOT NULL, # <P, C>, P = Player, C = Coach
CHECK(POSITION_BK = 'P' OR 'C')
,UNIQUE (ID_BK)
, PRIMARY KEY (ID_BK, POSITION_BK)
);
CREATE TABLE PLAYER_BK(
MEMBER_ID_BK INT,
MEMBER_POSITION_BK CHAR(1),
JERSEY_NUMBER_BK INT NOT NULL,
PHONE_BK CHAR(14) NOT NULL,
PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
FOREIGN KEY(MEMBER_ID_BK,MEMBER_POSITION_BK) REFERENCES MEMBER_BK(ID_BK,POSITION_BK ),
CHECK(MEMBER_POSITION_BK = 'P')
);
CREATE TABLE COACH_BK(
MEMBER_ID_BK INT,
MEMBER_POSITION_BK CHAR(1),
START_YEAR_BK YEAR NOT NULL,
EMAIL_BK VARCHAR(22) NOT NULL,
PRIMARY KEY(MEMBER_ID_BK, MEMBER_POSITION_BK),
FOREIGN KEY(MEMBER_ID_BK,MEMBER_POSITION_BK) REFERENCES MEMBER_BK(ID_BK,POSITION_BK ),
CHECK(MEMBER_POSITION_BK = 'C')
);