作为主键给出的一组属性的外键

时间:2017-11-10 15:59:20

标签: mysql

我有一个Class表,主键为SectionSemesterDepartment。另一个Student表,其中USN为主键。首先,为什么它允许我从Class.Semester引用Student.SEM?我不应该只允许Class中的一对属性引用Student中的主键作为Class.section中的外键吗?我还尝试从Student.Class引用#1215 - Cannot add foreign key constraint,我收到错误CREATE TABLE `Class` ( `Semester` int(1) NOT NULL, `Section` varchar(1) NOT NULL, `Department` varchar(3) NOT NULL, `CTID` varchar(10) NOT NULL DEFAULT '' ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `Class` ADD PRIMARY KEY (`Semester`,`Section`,`Department`); CREATE TABLE `student` ( `USN` varchar(10) NOT NULL, `DOB` date DEFAULT NULL, `Class` varchar(1) NOT NULL, `SEM` int(1) NOT NULL, `Dep` varchar(3) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT; ALTER TABLE `student` ADD PRIMARY KEY (`USN`), ADD KEY `Class` (`Class`,`SEM`,`Dep`), ADD KEY `SEM` (`SEM`); ALTER TABLE `student` ADD CONSTRAINT `student_ibfk_1` FOREIGN KEY (`SEM`) REFERENCES `Class` (`Semester`) ON DELETE CASCADE ON UPDATE CASCADE;

$content = file_get_contents('http://player.rockfm.fm/');

$content = preg_replace("/\r\n+|\r+|\n+|\t+/i", " ", $content);

preg_match('/<div id=\"metadata_player\">(.*?)<\/div>/', $content , $matchs);

print_r($matchs);

1 个答案:

答案 0 :(得分:0)

MySQL支持可用键中较少数量的列,只要列的列以键中的列列开头,如13.1.17.6 Using FOREIGN KEY Constraints中所述:

  
      
  • MySQL需要外键和引用键的索引,以便外键检查可以快速,不需要表扫描。 在引用表中,必须有一个索引,其中外键列被列为相同顺序的第一列。如果引用表不存在,则会自动在引用表上创建此索引。如果您创建另一个可用于强制执行外键约束的索引,则可以稍后以静默方式删除此索引。如果给定,则使用index_name,如前所述。
  •   
  • InnoDB允许外键引用任何列或列组。 但是,在引用的表中,必须有一个索引,其中引用的列被列为相同顺序的第一列
  •   

因此,在您的情况下,您可以使用列Semester,因为它是索引(Semester, Section, Department)的开头,但您无法使用SectionDepartment