我正在学习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
提前感谢您的帮助
答案 0 :(得分:3)
这是因为外键必须链接到唯一数据集,该数据集可以由主键或唯一约束属性组成。您可以链接外键中的多个列,但参考数据必须是唯一的。
在您的情况下,最简单的方法是通过将表创建更改为Deptno
,使Dept
成为主键{/ p>
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)
);
答案 1 :(得分:2)
部门表在DeptNo列上需要一个主键,以将其作为Emp表上的FK约束引用。
(是的,Oracle至少可以对错误消息更有用)
答案 2 :(得分:1)
谷歌搜索提出了这个Oracle/PLSQL: ORA-02270 Error,这让我相信一个表调用DEPT不存在,它有一个名为Depto的主键列,并且导致错误。我希望这有用。
编辑:我不相信你可以在创建表之前设置一个oracle递归外键,此时你需要改变表来添加递归键。