1

我正在学习 SQL,并且正在使用 oracle SQL Dev。我有一个 PRIMAR Y KEY 概念的例子:这里是代码

  drop table Dept;
  drop table Emp;
  -- creating a  Dept Table
  create Table Dept(
 Deptno  INTEGER NOT NULL,
  Dname VARCHAR(14),
  Loc varchar(13)
  );
  -- creating Emp Table
   create table Emp(
   Empno INTEGER NOT NULL,
   Ename VARCHAR(10),
   jobb VARCHAR(9),
   Mgr INTEGER,
   Hiredate DATE,
   Sal DECIMAL, 
   Comm DECIMAL,
   Deptno INTEGER NOT NULL,
   CONSTRAINT F_Emp FOREIGN KEY(Deptno) REFERENCES DEPT(Deptno),
   CONSTRAINT P_Emp PRIMARY KEY(Empno)
);

在这里得到的错误消息,我不明白错误到底是什么?

Error at Command Line:19 Column:56
 Error report:
 SQL Error: ORA-02270: no matching unique or primary key for this column-list
02270. 00000 -  "no matching unique or primary key for this column-list"
 *Cause:    A REFERENCES clause in a CREATE/ALTER TABLE statement
       gives a column-list for which there is no matching unique or primary
       key constraint in the referenced table.
*Action:   Find the correct column names using the ALL_CONS_COLUMNS
       catalog view 

在此先感谢您的帮助

4

3 回答 3

3

这是因为外键必须链接到可以由主键或唯一约束属性组成的唯一数据集。您可以链接外键中的多个列,但引用数据必须是唯一的。

在您的情况下,最简单的方法是Deptno通过Dept将表创建更改为:

create Table Dept(
  Deptno  INTEGER NOT NULL,
  Dname VARCHAR(14),
  Loc varchar(13),
  CONSTRAINT P_Dept PRIMARY KEY(Deptno)
);

对于您不希望 FK 引用 PK 的情况,您可以在引用表中所需的字段上创建唯一约束。首先必须做的第一件事是它必须NOT NULL在引用表中的引用列上指定约束。然后是添加CONSTRAINT const_name UNIQUE (col_name)到引用表以强制唯一值的情况。

举个例子。假设您想链接到电话号码。所以我们可以改变你的例子如下:

drop table Dept;
drop table Emp;
-- creating a  Dept Table
create Table Dept(
  Deptno  INTEGER NOT NULL,
  Dname VARCHAR(14),
  Loc varchar(13),
  TelNo INTEGER NOT NULL,
  CONSTRAINT tel_no_uq UNIQUE (TelNo)
);
-- creating Emp Table
create table Emp(
  Empno INTEGER NOT NULL,
  Ename VARCHAR(10),
  jobb VARCHAR(9),
  Mgr INTEGER,
  Hiredate DATE,
  Sal DECIMAL, 
  Comm DECIMAL,
  Deptno INTEGER NOT NULL,
  TelNo INTEGER NOT NULL,
  CONSTRAINT F_Emp_Tel FOREIGN KEY(TelNo) REFERENCES DEPT(TelNo),
  CONSTRAINT P_Emp PRIMARY KEY(Empno)
);
于 2013-04-07T11:33:59.080 回答
2

部门表在 DeptNo 列上需要一个主键,以将其作为 Emp 表上的 FK 约束引用。

(是的,至少可以说,Oracle 在错误消息上可能更有用)

于 2013-04-07T11:21:06.753 回答
1

谷歌搜索出现了这个Oracle/PLSQL:ORA-02270 错误,这让我相信不存在具有名为 Depto 的主键列的表调用 DEPT,这就是导致错误的原因。我希望这是有帮助的。

编辑:我不相信您可以在创建表之前设置 oracle 递归外键,此时您需要更改表以添加递归键。

于 2013-04-07T11:23:51.467 回答