当我尝试创建一个包含 1 PK 和 3 FK 的表时。但遇到以下错误。
代码1:
SQL:
CREATE TABLE Rent
(
cardID number,
itemID varchar2(10),
appropriationDate DATE,
returndate DATE,
CONSTRAINT Rent_pk
PRIMARY KEY(cardID, itemID),
CONSTRAINT Rent_fk
FOREIGN KEY (cardID) REFERENCES Card(cardID),
CONSTRAINT Rent_fk
FOREIGN KEY (itemID) REFERENCES Book(bookID),
CONSTRAINT Rent_fk
FOREIGN KEY (itemID) REFERENCES Videos(videoID)
);
错误:
错误报告
ORA-02270: 此列列表没有匹配的唯一键或主键 02270. 00000 - “此列列表没有匹配的唯一键或主键”
*原因:CREATE/ALTER TABLE 语句中的 REFERENCES 子句给出的列列表在引用的表中没有匹配的唯一键或主键约束。
*操作:使用 ALL_CONS_COLUMNS 目录视图查找正确的列名称
代码2:
CREATE TABLE Employees
(
employeeID number,
name varchar2(40),
address varchar2(40),
empphone number(9),
paycheck number(8,2),
username varchar2(10),
password varchar2(20),
cardnumber number,
branchname varchar2(40),
CONSTRAINT Employees_pk
PRIMARY KEY(employeeID),
CONSTRAINT Employees_fk
FOREIGN KEY (cardnumber) REFERENCES Card(cardID),
CONSTRAINT Employees_fk
FOREIGN KEY (branchname) REFERENCES Branch(bname)
);
错误报告
ORA-02264: 名称已被现有约束使用
02264. 00000 - “名称已被现有约束使用”
*原因:指定的约束名称必须是唯一的。
*操作:为约束指定唯一的约束名称。
如何添加多个外键?请帮助我
错误
ORA-02270
告诉您您尝试创建的外键与引用表中的唯一或主键约束不匹配。
在您的代码中,
itemID
字段引用Book
和Videos
表。看来您正在尝试强制 itemID
可以是 bookID
或 videoID
。标准 SQL 外键约束不直接支持这一点。
您可以通过为
RentBook
和 RentVideo
创建单独的表,或者在 Rent
表中引入单独的类型字段来解决此问题。
CREATE TABLE Rent
(
cardID number,
itemID varchar2(10),
itemType varchar2(10) CHECK (itemType IN ('Book', 'Video')),
appropriationDate DATE,
returndate DATE,
CONSTRAINT Rent_pk
PRIMARY KEY(cardID, itemID),
CONSTRAINT Rent_card_fk
FOREIGN KEY (cardID) REFERENCES Card(cardID),
CONSTRAINT Rent_book_fk
CHECK (itemType = 'Book' AND itemID IN (SELECT bookID FROM Book)),
CONSTRAINT Rent_video_fk
CHECK (itemType = 'Video' AND itemID IN (SELECT videoID FROM Videos))
);
错误
ORA-02264
告诉您约束名称在模式中必须是唯一的。在给定的代码中,您对两个外键约束使用了名称 Employees_fk
,这导致了错误。只需给它们起一个独特的名字,如下所示:
CREATE TABLE Employees
(
employeeID number,
name varchar2(40),
address varchar2(40),
empphone number(9),
paycheck number(8,2),
username varchar2(10),
password varchar2(20),
cardnumber number,
branchname varchar2(40),
CONSTRAINT Employees_pk
PRIMARY KEY(employeeID),
CONSTRAINT Employees_card_fk
FOREIGN KEY (cardnumber) REFERENCES Card(cardID),
CONSTRAINT Employees_branch_fk
FOREIGN KEY (branchname) REFERENCES Branch(bname)
);