无法创建表。SQL错误02270
这是我正在尝试创建的表。然而,我得到了错误 SQL错误:ORA-02270:此列列表没有匹配的唯一键或主键 SQL: 这些是父表:无法创建表。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
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中不是一个保留字:一般来说,这是一个需要时刻牢记的好问题。