尝试在SQL中为表创建外键时出错?

时间:2016-09-27 05:23:41

标签: mysql sql

我正在创建一个屏幕表:

CREATE TABLE SCREEN(
BRANCHID CHAR(2) NOT NULL,
SCREENID CHAR(2) NOT NULL,
SCREENCACPACITY NUMBER(3),
CONSTRAINT SCREEN_PK PRIMARY KEY(BRANCHID, SCREENID),
CONSTRAINT SCREEN_FK FOREIGN KEY(BRANCHID) REFERENCES BRANCH(BRANCHID));

但是当我创建会话表时:

CREATE TABLE SESSIONS(
SESSIONID CHAR(4) NOT NULL,
BRANCHID CHAR(2) NOT NULL,
SCREENID CHAR(2) NOT NULL,
MOVIEID CHAR(2) NOT NULL,
SESSIONDATE DATE,
SESSIONPRICE NUMBER(4,2),
CONSTRAINT SESSIONS_PK PRIMARY KEY(SESSIONID),
CONSTRAINT SESSIONS_FK1 FOREIGN KEY(BRANCHID) REFERENCES BRANCH(BRANCHID),
CONSTRAINT SESSIONS_FK2 FOREIGN KEY(SCREENID) REFERENCES SCREEN(SCREENID),
CONSTRAINT SESSIONS_FK3 FOREIGN KEY(MOVIEID) REFERENCES MOVIE(MOVIEID));

我得到一个"此列列表没有匹配的唯一或主键"错误。我知道错误是在Screen表中,因为我自己尝试了所有外键,而Screen是唯一一个给我错误的。因此,当我尝试运行完整的脚本时,由于Screen而无法运行。

分支和电影屏幕已经制作,并且与屏幕大致相同。帮助pl0x

3 个答案:

答案 0 :(得分:0)

支持外键的大多数(如果不是全部)SQL样式将强制您将外键指向整个主键。在您的情况下,表SCREEN具有(BRANCHID,SCREENID)AS PK,但您的SESSIONS_FK2 FK仅指向SCREENID。

您应该创建一个指定两列的外键。类似的东西:

CONSTRAINT FK_SESSION_SCREEN FOREIGN KEY (BRANCHID, SCREENID) REFERENCES SCREEN(BRANCHID, SCREENID)

需要考虑的其他事项:

1)如果您的目标是规范化,可能应该将分支和屏幕分开(因此,每个都有一个列主键)

2)使用有意义的名称命名约束,以便直接了解它们的作用。

答案 1 :(得分:0)

你好Rob,<>在Session表中,您已经定义了外键,但是在父表中.i.e,在屏幕表中没有关注主键。请检查其他表,它是否具有主键约束。

答案 2 :(得分:0)

SCREENID不是UNIQUE或PRIMARY KEY的事实不允许你像CONSTRAINT SESSIONS_FK2 FOREIGN KEY(SCREENID)中提到的那样使它成为外键。

所以你需要将SCREENID作为表SCREEN的PRIMARY KEY。