无法创建表。SQL错误02270

无法创建表。SQL错误02270,sql,database,oracle,oracle11g,oracle-sqldeveloper,Sql,Database,Oracle,Oracle11g,Oracle Sqldeveloper,这是我正在尝试创建的表。然而,我得到了错误 SQL错误:ORA-02270:此列列表没有匹配的唯一键或主键 SQL: 这些是父表: create table Courses ( cid char(20), cname char(20), credits integer, constraint CoursesKey Primary Key (cid, cname) ); CREATE TABLE ROOMS ( rno INTEGER, addr

这是我正在尝试创建的表。然而,我得到了错误

SQL错误:ORA-02270:此列列表没有匹配的唯一键或主键

SQL:

这些是父表:

create table Courses
(
    cid char(20),
    cname char(20),
    credits integer,
    constraint CoursesKey Primary Key (cid, cname)
);

CREATE TABLE ROOMS 
(
    rno INTEGER,
    address CHAR(20),
    capacity INTEGER,
    CONSTRAINT room_key PRIMARY KEY(rno)
);

我不明白为什么会出现此错误。

中的Meets\u充当关联表。因此,它的主键应该将外键包含到它关联的表中

请尝试包含以下内容的主键:
cid
cname
rno
time

正如其他人所指出的,您的
课程
的主键是
(cid,cname)
,因此您还需要在外键约束
中包含这两个键。或者,如果可能,确保
cid
仅是
课程
上的主键


(我认为<代码>时间<代码>可能是一个保留词,所以可能考虑重命名它。)

<代码> MeETSx在中作为一个关联表。因此,它的主键应该将外键包含到它关联的表中

请尝试包含以下内容的主键:
cid
cname
rno
time

正如其他人所指出的,您的
课程
的主键是
(cid,cname)
,因此您还需要在外键约束
中包含这两个键。或者,如果可能,确保
cid
仅是
课程
上的主键

(我认为<代码>时间<代码>可能是一个保留词,所以也许考虑重命名它。)< /P> 原因

如错误消息所示,ORA-2270在
没有与此列列表匹配的唯一键或主键时发生。这可能是因为

  • 父级完全缺少约束
  • 父表的约束是一个复合键,我们没有引用外键语句中的所有列
现在在您的
课程
表中,
CID
不是
主键
。它是cid和cname的组合。因此,对于每个
cid
,可以有多行

现在,当您引用
cid
作为
meets_in
的外键时,它将不起作用,因为它违反了我上面提到的第二点

变通办法

表中的
meets_中添加列
cname
。然后像下面那样使用它

create table Meets_In
(
    cid char(20) not null,
        cname char(20),
    rno integer not null,
    time1 char(20) not null,
    CONSTRAINT PRIM_KEY PRIMARY KEY(time1),
    constraint meets_fk1 foreign key(cid,cname) references COURSES (cid,cname), /*Added cid,cname */
    constraint meets_fk2 foreign key(rno) references ROOMS (RNO)
); 
原因

如错误消息所示,ORA-2270在
没有与此列列表匹配的唯一键或主键时发生。这可能是因为

  • 父级完全缺少约束
  • 父表的约束是一个复合键,我们没有引用外键语句中的所有列
现在在您的
课程
表中,
CID
不是
主键
。它是cid和cname的组合。因此,对于每个
cid
,可以有多行

现在,当您引用
cid
作为
meets_in
的外键时,它将不起作用,因为它违反了我上面提到的第二点

变通办法

表中的
meets_中添加列
cname
。然后像下面那样使用它

create table Meets_In
(
    cid char(20) not null,
        cname char(20),
    rno integer not null,
    time1 char(20) not null,
    CONSTRAINT PRIM_KEY PRIMARY KEY(time1),
    constraint meets_fk1 foreign key(cid,cname) references COURSES (cid,cname), /*Added cid,cname */
    constraint meets_fk2 foreign key(rno) references ROOMS (RNO)
); 


可能是因为
time
在(某些版本的)SQL中是保留字。你可以试着重命名它。试过了,但不起作用。我得到了相同的错误。为什么需要在表
课程
的主键中包含
cname
cid
不是唯一标识符吗?(如果不是,为什么不呢?)可能是因为
time
在(某些版本的)SQL中是一个保留字。你可以试着重命名它。试过了,但不起作用。我得到了相同的错误。为什么需要在表
课程
的主键中包含
cname
cid
不是唯一标识符吗?(如果不是,为什么不呢?)那么,如果我只需要
cid
,我将如何在表
Meet\u in
中引用
cid,cname
?这可能吗?为什么
cname
中没有
notnull
?我认为更好的解决方法是从PK中删除
cname
cid
就足够了。如果没有,这是一个单独的问题,应该纠正。您可以添加它以确保安全。但是它可以在不明确提及它的情况下工作。@RomanLopez-正如@mathguy建议的那样,你能检查一下你是否可以从
courses
表中删除
cname
作为主键吗?那么如果我只需要
cid
,我该如何在
表中引用
cid,cname
?这可能吗?为什么
cname
中没有
notnull
?我认为更好的解决方法是从PK中删除
cname
cid
就足够了。如果没有,这是一个单独的问题,应该纠正。您可以添加它以确保安全。但它可以在不明确提及的情况下工作。@RomanLopez-正如@mathguy所建议的,您可以检查一下是否可以从
课程表中删除
cname
作为主键吗?
time
在Oracle中不是一个保留字:一般来说,这是一个需要时刻牢记的好问题。
time
在Oracle中不是一个保留字:一般来说,这是一个需要时刻牢记的好问题。