簡體   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