我有一个Class
表,主键为Section
,Semester
和Department
。另一个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);
答案 0 :(得分:0)
MySQL支持可用键中较少数量的列,只要列的列以键中的列列开头,如13.1.17.6 Using FOREIGN KEY Constraints中所述:
- MySQL需要外键和引用键的索引,以便外键检查可以快速,不需要表扫描。 在引用表中,必须有一个索引,其中外键列被列为相同顺序的第一列。如果引用表不存在,则会自动在引用表上创建此索引。如果您创建另一个可用于强制执行外键约束的索引,则可以稍后以静默方式删除此索引。如果给定,则使用index_name,如前所述。
- InnoDB允许外键引用任何列或列组。 但是,在引用的表中,必须有一个索引,其中引用的列被列为相同顺序的第一列。
因此,在您的情况下,您可以使用列Semester
,因为它是索引(Semester, Section, Department)
的开头,但您无法使用Section
或Department
。