我正在设计一个关于SQL的航空预订系统,我有两个问题:
1。这是使用复合键创建桥表的正确方法(其中有两个主键,它们都是引用其他表的外键)?
CREATE TABLE FlightAndWeekday
(
WeekID int(1) NOT NULL,
FlightID varchar(5) NOT NULL,
PRIMARY KEY (WeekID, FlightID),
CONSTRAINT fk_FAW_WeekId FOREIGN KEY (WeekID) REFERENCES `Weekday`(`WeekID`),
CONSTRAINT fk_FAW_FlightID FOREIGN KEY (FlightID) REFERENCES `Flight`(`FlightID`)
);
当我运行该代码块时,它运行成功,但是当我写Show create table FlightAndWeekday
时,外键没有显示。此外,我可以在表格中添加其他表格中不存在的记录......这将我带到下一个问题。
2. 为什么我能够在外键列中添加他们引用的列中不存在的记录?例如,我将表A上的列A配置为表B上的外键引用列B.但是,我能够在列A中添加在表B中的列B中不存在的记录... 我用来创建外键的语法是:
CONSTRAINT fk_PaymentInfo_UserID FOREIGN KEY (UserID) REFERENCES Customer(CustomerID)
答案 0 :(得分:1)
CREATE TABLE Weekday
( WeekID INT PRIMARY KEY -- one of many options
)engine=innodb;
CREATE TABLE Flight
( FlightID varchar(5) PRIMARY KEY -- one of many options
)engine=innodb;
CREATE TABLE FlightAndWeekday
( WeekID int(1) NOT NULL,
FlightID varchar(5) NOT NULL,
PRIMARY KEY (WeekID, FlightID),
FOREIGN KEY fk_FAW_WeekId (WeekID) REFERENCES `Weekday`(`WeekID`),
FOREIGN KEY fk_FAW_FlightID (FlightID) REFERENCES `Flight`(`FlightID`)
)engine=innodb;
show create table FlightAndWeekday;
CREATE TABLE `flightandweekday` (
`WeekID` int(1) NOT NULL,
`FlightID` varchar(5) NOT NULL,
PRIMARY KEY (`WeekID`,`FlightID`),
KEY `fk_FAW_FlightID` (`FlightID`),
CONSTRAINT `flightandweekday_ibfk_1` FOREIGN KEY (`WeekID`) REFERENCES `weekday` (`WeekID`),
CONSTRAINT `flightandweekday_ibfk_2` FOREIGN KEY (`FlightID`) REFERENCES `flight` (`FlightID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
因为在上一个表格引用表中,您有FlightID
作为复合主键的一部分(并且该段不是最左侧 ),创建一个名为fk_FAW_FlightID
的辅助索引。
相比之下,WeekID
在引用中的PK中是最左侧,因此无需创建帮助索引。
上述评论见于名为Using FOREIGN KEY Constraints
的手册页的摘录中MySQL要求外键和引用键上的索引 外键检查可以很快,不需要表扫描。在里面 引用表时,必须有一个索引所在的外键 列以相同顺序列为第一列。这样的 如果不是,则会自动在引用表上创建索引 存在。如果您创建,可能会稍后以静默方式删除此索引 另一个可用于强制执行外键约束的索引。 如果给定,则使用index_name,如前所述。
我相信上述内容将符合您对FK的意愿。