此列列表没有匹配的唯一键或主键(尝试添加两个 FK)



我收到错误,此列列表没有匹配的唯一键或主键,可能是什么?我正在使用oracle实时sql。收到错误的表是最后一个,其他表工作正常。错误为 ORA 02270

CREATE TABLE flightBooking
( bookingCode varchar(5) not null, 
stretchSet varchar(50),
expireDate varchar(12),
CONSTRAINT flightBooking_pk PRIMARY KEY (bookingCode)
); 
CREATE TABLE customer
( cpf varchar(10),
rg varchar(7),
personName varchar(30),
birth varchar(12),
email varchar(30),
city varchar(30),
uf varchar(2),
bookingCode varchar(5) not null,
CONSTRAINT fk_bookingCode FOREIGN KEY (bookingCode) REFERENCES flightBooking(bookingCode)
);  
CREATE TABLE stretch
( flightDate varchar(12),
flightHour varchar(6),
flightClass varchar(15),
flightCode varchar(5) not null,
destination varchar(30),
origin varchar(30),
scale varchar(60),
aeroplaneType varchar(30)
);
CREATE TABLE sell
(voucher varchar(50),
bookingCode varchar(5) not null,
flightCode varchar(5) not null,
CONSTRAINT fk_bookingCode FOREIGN KEY (bookingCode) REFERENCES flightBooking(bookingCode),
CONSTRAINT fk_flightCode FOREIGN KEY (flightCode) REFERENCES stretch(flightCode)
);````

外键必须指向作为键的列(或列的元组),即声明为主键或至少是唯一的。

大概你忘记了strechonflightcode的主键约束。

CREATE TABLE stretch
(...
PRIMARY KEY (flightcode));

作为旁注:stretchsetflightbooking看起来很可疑。如果您打算在其中存储逗号(或任何其他字符)分隔的flightcodestrech列表,请不要这样做。相反,请阅读"在数据库列中存储分隔列表真的那么糟糕吗?"并使用另一个链接预订和延伸的表来规范架构。

另一个旁注:bookingcode可能不应该被customer,因为这意味着一个客户只能进行一次预订。考虑预订表中客户的外键。

还有一个:使用适当的数据类型。像flightdate(和flighthour,实际上应该包含在flightdate中)这样的日期/时间stretchbirthcustomerexpiredateflightbooking中不应该是字符串。请改用日期/时间类型。

您引用的表必须具有 - 如错误消息所述 - 唯一键或主键。

您引用STRETCH表及其FLIGHTCODE列,但其上没有唯一键或主键。我建议你创建它。


A 旁注:使用varchar2,而不是varchar

最新更新