尝试在 SQL 中为表创建外键时出错? [复制]

Posted

技术标签:

【中文标题】尝试在 SQL 中为表创建外键时出错? [复制]【英文标题】:Error when trying to create foreign key for table in SQL? [duplicate] 【发布时间】:2017-02-04 14:35:00 【问题描述】:

我正在创建一个屏幕表:

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

【问题讨论】:

相对于您在上面向我们展示的两个 CREATE TABLE 语句,BRANCHES 表是在哪里创建的? @TimBiegeleisen 这是第一个创建的 【参考方案1】:

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

您应该创建一个指定两列的外键。比如:

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

其他需要考虑的事项:

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

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

【讨论】:

这似乎有效,谢谢。我会记住这些提示,谢谢。【参考方案2】:

嗨 Rob, 在 Session 表中,您已经定义了外键,但在父表中,即在屏幕表中没有关注主键。请检查其他表是否有主键约束。

【讨论】:

【参考方案3】:

正如您在CONSTRAINT SESSIONS_FK2 FOREIGN KEY(SCREENID) 中提到的那样,SCREENID 不是 UNIQUE 或 PRIMARY KEY 的事实不能让您将其设为 FOREIGN KEY。

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

【讨论】:

我有,它与 BRANCHID 的复合,或者这不是你的意思?

以上是关于尝试在 SQL 中为表创建外键时出错? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

oracle为表建立外键时没有命名FOREIGN KEY约束,现在想删外键怎么办??

sql怎么设置外键

sql怎么设置外键

在 Knex 中为表命名

尝试将行插入表因为带有sequelize.js的UUID外键时出错

创建外键时,phpmyadmin 中的外键约束失败