繁体   English   中英

Oracle mySQL:无法添加外键约束

[英]Oracle mySQL : Cannot add foreign key constraint

我正在创建一个数据库表。 具体来说,这段代码由于某种原因不会添加两个外键,它表示无法添加外键约束,我将向您展示我所指的表。

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的答案是你想要什么,只是想指出的是,指数不必是复合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM