外键似乎没有按预期工作?

时间:2016-09-18 18:22:18

标签: mysql database

我正在设计一个关于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)

1 个答案:

答案 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的意愿。