【问题标题】:Cannot create table. SQL Error 02270无法创建表。 SQL 错误 02270
【发布时间】:2016-09-21 02:52:12
【问题描述】:

这是我要创建的表。但是,我收到错误

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

SQL:

create table Meets_In
(
    cid char(20),
    rno integer,
    time char(20),
    CONSTRAINT PRIM_KEY PRIMARY KEY(time),
    constraint meets_fk1 foreign key(cid) references COURSES(CID),
    constraint meets_fk2 foreign key(rno) references ROOMS(RNO)
); 

这些是父表:

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)
);

我不明白为什么会收到此错误。

【问题讨论】:

  • 可能是因为time 是(某些版本的)SQL 中的保留字。您可以尝试重命名它。
  • 试过了,还是不行。我得到同样的错误。
  • 为什么需要在表courses的主键中包含cnamecid 不是已经是唯一标识符了吗? (如果不是,为什么不呢?)

标签: sql database oracle oracle11g oracle-sqldeveloper


【解决方案1】:

原因

如错误消息所示,ORA-2270 在存在no matching unique or primary key for this column-list 时发生。这可能是因为

  • 父级完全没有约束
  • 父表的约束是复合键,我们没有引用外键语句中的所有列。

现在在您的COURSES 表中,CID 不是primary key。它是cid,cname 的组合。所以对于每个cid,可以有多行。

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

解决方法

在您的meets_in 表中添加列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)
); 

【讨论】:

  • 那么如果我只需要cid,我将如何在表Meet_in 中引用cid, cname?这可能吗?
  • 为什么cname里面没有not null
  • 我认为更好的解决方法是从 PK 中删除 cname - 仅 cid 就足够了。如果不是,那是一个单独的问题,应该予以纠正。
  • 您可以添加它以确保安全。但它可以在不明确提及的情况下工作。
  • @RomanLopez - 正如@mathguy 建议的那样,您能否检查是否可以从courses 表中删除cname 作为主键?
【解决方案2】:

Meets_In 充当关联表。因此,它的主键应该将外键包含在它所关联的表中。

尝试使用以下组成的主键:cidcnamernotime

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

(我认为time 可能是保留字,所以不妨考虑重命名它。)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多