问题描述
CREATE TABLE Route(
RouteNo VARCHAR(10),Origin VARCHAR(30),Destination VARCHAR(30),DepartureTime VARCHAR(15),SerialNo VARCHAR(5),ArrivalTime VARCHAR(15),PRIMARY KEY(RouteNo) );
CREATE TABLE Employee(
EmployeeID VARCHAR(5) NOT NULL,Name VARCHAR(30),Phone NUMBER,JobTitle VARCHAR(30),PRIMARY KEY(EmployeeID) );
CREATE TABLE Flight(
SerialNo VARCHAR(5),RouteNo VARCHAR(5),FlightDate DATE,ActualTD VARCHAR(10),ActualTA VARCHAR(10),PRIMARY KEY(SerialNo,RouteNo,FlightDate),FOREIGN KEY(RouteNo) REFERENCES Route(RouteNo),FOREIGN KEY(SerialNo) REFERENCES Airplane(SerialNo) ); -- does Airplane table exists ?
CREATE TABLE CrewAssigment(
EmployeeID VARCHAR(5),Role VARCHAR(45),Hours INT,PRIMARY KEY(EmployeeID,FOREIGN KEY(EmployeeID) REFERENCES Employee(EmployeeID),FOREIGN KEY(FlightDate) REFERENCES Flight(FlightDate) );
Select * from CrewAssignment
这是我在 CrewAssignment 表中遇到错误的代码,上面是引用外键的表。
错误报告 - ORA-02270: 此列列表没有匹配的唯一键或主键 02270. 00000 - “此列列表没有匹配的唯一键或主键” *原因:CREATE/ALTER TABLE 语句中的 REFERENCES 子句 给出没有匹配的唯一或主要的列列表 引用表中的键约束。 *操作:使用 ALL_CONS_COLUMNS 查找正确的列名 目录视图
解决方法
一些反对意见。
-
这显然是一个 Oracle 问题,而不是 MySQL。我怎么知道?
ORA-02270
是 Oracle 数据库错误代码;注意你使用的标签。 -
您应该使用
VARCHAR2
数据类型而不是VARCHAR
。为什么? Oracle 建议这样做。 -
create table flight
首先失败,因为它引用了airplane
表,并且它还不存在(至少,在您发布的代码中不存在) -
您抱怨的错误是由于
create table crewassignment
。它的一个外键引用了flight
表:FOREIGN KEY(flightdate) REFERENCES flight(flightdate)
但是
flight
的主键是复合的,由 3 列组成:PRIMARY KEY(serialno,routeno,flightdate)
这意味着您无法创建该外键。
那么,怎么办?不知道,我不知道负责这种数据模型的规则。要么修改flight
表的主键,要么修改crewassingment
表的外键约束。
也许您可以向 flight
表(由序列(或标识列,如果您的数据库版本支持)组成)添加一个新列,然后让 crewassignment
表引用 主键。您当前用作主键 (serialno,flightdate
) 的列将切换为 唯一 键。