我正在创建一个数据库表。具体来说,由于某种原因,这段代码不会添加两个外键,它说不能添加外键约束,我会给你看我所指的表。
mysql> ALTER TABLE PROGRAM
-> ADD SeriesName varchar(100) NOT NULL, ADD StartYear char(4) NOT NULL,
-> ADD CONSTRAINT program_seriesname_fk
-> FOREIGN KEY(SeriesName) REFERENCES SERIES(SeriesName),
-> ADD CONSTRAINT program_startyear_fk
-> FOREIGN KEY(StartYear) REFERENCES SERIES(StartYear);
ERROR 1215 (HY000): Cannot add foreign key constraint
SERIES表有PROGRAM表,这意味着它是一个1:N(一对多关系)。因此,SERIES中的两个主键就变成了PROGRAM中的两种外键。
mysql> describe series;
+------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+--------------+------+-----+---------+-------+
| SeriesName | varchar(100) | NO | PRI | | |
| StartYear | char(4) | NO | PRI | | |
| EndYear | char(4) | YES | | NULL | |
+------------+--------------+------+-----+---------+-------+
3 rows in set (0.07 sec)
mysql> describe program;
+-------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+---------+-------+
| ProgramName | varchar(50) | NO | PRI | | |
| Description | varchar(255) | YES | | NULL | |
| Recorded | date | NO | | NULL | |
+-------------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
series
表上有复合PK,因此不能在FK约束中单独使用这些字段
ADD CONSTRAINT program_seriesname_fk
FOREIGN KEY(SeriesName, StartYear) REFERENCES SERIES(SeriesName, StartYear)
要在InnoDB中为单个列创建外键,您引用的列需要是至少一个索引中的第一列。
ALTER TABLE program
ADD CONSTRAINT program_startyear_fk
FOREIGN KEY(StartYear) REFERENCES SERIES(StartYear);
将不起作用,因为SERIES(StartYear)是SERIES主键索引中的第二列。如果你先添加一个索引;
CREATE INDEX ix_program ON series(StartYear);
ALTER TABLE program
ADD CONSTRAINT program_startyear_fk
FOREIGN KEY(StartYear) REFERENCES SERIES(StartYear);
它会起作用的。
现在,如果你真正想要的是一个复合索引,@Parado的答案就是你想要的,只是想指出索引不具有复合性。