2015-03-25 81 views
7

我想創建健身房管理系統的數據庫,但我不明白爲什麼我得到這個錯誤。我試圖在這裏搜索答案,但我找不到它。不能添加外鍵約束 - MySQL錯誤1215(HY000)

ERROR 1215 (HY000): Cannot add foreign key constraint 

CREATE TABLE sales(
    saleId int(100) NOT NULL AUTO_INCREMENT, 
    accountNo int(100) NOT NULL, 
    payName VARCHAR(100) NOT NULL, 
    nextPayment DATE, 
    supplementName VARCHAR(250), 
    qty int(11), 
    workoutName VARCHAR(100), 
    sDate datetime NOT NULL DEFAULT NOW(), 
    totalAmount DECIMAL(11,2) NOT NULL, 
    CONSTRAINT PRIMARY KEY(saleId, accountNo, payName), 
    CONSTRAINT FOREIGN KEY(accountNo) REFERENCES accounts(accountNo) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(payName) REFERENCES paymentFor(payName) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(supplementName) REFERENCES supplements(supplementName) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(workoutName) REFERENCES workouts(workoutName) ON DELETE CASCADE ON UPDATE CASCADE 
); 
    ALTER TABLE sales AUTO_INCREMENT = 2001; 

這裏是父表。

CREATE TABLE accounts(
    accountNo int(100) NOT NULL AUTO_INCREMENT, 
    accountType VARCHAR(100) NOT NULL, 
    firstName VARCHAR(50) NOT NULL, 
    lastName VARCHAR(60) NOT NULL, 
    birthdate DATE NOT NULL, 
    gender VARCHAR(7), 
    city VARCHAR(50) NOT NULL, 
    street VARCHAR(50), 
    cellPhone VARCHAR(10), 
    emergencyPhone VARCHAR(10), 
    email VARCHAR(150) NOT NULL, 
    description VARCHAR(350), 
    occupation VARCHAR(50), 
    createdOn datetime NOT NULL DEFAULT NOW(), 
    CONSTRAINT PRIMARY KEY(accountNo) 
); 
    ALTER TABLE accounts AUTO_INCREMENT = 1001; 


CREATE TABLE supplements(
    supplementId int(100) NOT NULL AUTO_INCREMENT, 
    supplementName VARCHAR(250) NOT NULL, 
    manufacture VARCHAR(100), 
    description VARCHAR(150), 
    qtyOnHand INT(5), 
    unitPrice DECIMAL(11,2), 
    manufactureDate DATE, 
    expirationDate DATE, 
    CONSTRAINT PRIMARY KEY(supplementId, supplementName) 
); 
    ALTER TABLE supplements AUTO_INCREMENT = 3001; 

CREATE TABLE workouts(
    workoutId int(100) NOT NULL AUTO_INCREMENT, 
    workoutName VARCHAR(100) NOT NULL, 
    description VARCHAR(7500) NOT NULL, 
    duration VARCHAR(30), 
    CONSTRAINT PRIMARY KEY(workoutId, workoutName) 
); 
    ALTER TABLE workouts AUTO_INCREMENT = 4001; 



CREATE TABLE paymentFor(
    payId int(100) NOT NULL AUTO_INCREMENT, 
    payName VARCHAR(100) NOT NULL, 
    amount DECIMAL(11,2), 
    CONSTRAINT PRIMARY KEY(payId, payName) 
); 
    ALTER TABLE paymentFor AUTO_INCREMENT = 5001; 

你們能幫我解決這個問題嗎?謝謝。

+1

不知道這是它,但在'sales',既不'supplementName'也不'workoutName'是NOT NULL就像他們在'workouts'表引用的列和「補充」表。我在理論上認爲涉及外鍵的列必須完全匹配。 – MingShun 2015-03-25 05:36:17

+1

可能重複的[MySQL - 錯誤代碼1215,無法添加外鍵約束](http://stackoverflow.com/questions/22799001/mysql-error-code-1215-cannot-add-foreign-key-constraint) – 2016-08-04 15:12:37

回答

18

對於要定義爲foreign key的字段,引用的父字段必須具有在其上定義的索引。

作爲每文檔上foreign key約束:

參考parent_tbl_name(一個index_col_name,...)

分別INDEXworkouts.workoutNamepaymentFor.paymentName,和supplements.supplementName定義。並確保子列的定義必須與其父列定義的匹配。

變化workouts表如下定義:

CREATE TABLE workouts(
    workoutId int(100) NOT NULL AUTO_INCREMENT, 
    workoutName VARCHAR(100) NOT NULL, 
    description VARCHAR(7500) NOT NULL, 
    duration VARCHAR(30), 

    KEY (workoutName), -- <---- this is newly added index key 

    CONSTRAINT PRIMARY KEY(workoutId, workoutName) 
); 

變化supplements表的定義如下:

CREATE TABLE supplements(
    supplementId int(100) NOT NULL AUTO_INCREMENT, 
    supplementName VARCHAR(250) NOT NULL, 
    manufacture VARCHAR(100), 
    description VARCHAR(150), 
    qtyOnHand INT(5), 
    unitPrice DECIMAL(11,2), 
    manufactureDate DATE, 
    expirationDate DATE, 

    KEY (supplementName), -- <---- this is newly added index key 

    CONSTRAINT PRIMARY KEY(supplementId, supplementName) 
); 

變化paymentFor表的定義如下:

CREATE TABLE paymentFor(
    payId int(100) NOT NULL AUTO_INCREMENT, 
    payName VARCHAR(100) NOT NULL, 
    amount DECIMAL(11,2), 

    KEY (payName), -- <---- this is newly added index key 

    CONSTRAINT PRIMARY KEY(payId, payName) 
); 

現在,改變孩子表定義爲b elow:

CREATE TABLE sales(
    saleId int(100) NOT NULL AUTO_INCREMENT, 
    accountNo int(100) NOT NULL, 
    payName VARCHAR(100) NOT NULL, 
    nextPayment DATE, 
    supplementName VARCHAR(250) NOT NULL, 
    qty int(11), 
    workoutName VARCHAR(100) NOT NULL, 
    sDate datetime NOT NULL DEFAULT NOW(), 
    totalAmount DECIMAL(11,2) NOT NULL, 
    CONSTRAINT PRIMARY KEY(saleId, accountNo, payName), 
    CONSTRAINT FOREIGN KEY(accountNo) 
     REFERENCES accounts(accountNo) 
     ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(payName) 
     REFERENCES paymentFor(payName) 
     ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(supplementName) 
     REFERENCES supplements(supplementName) 
     ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT FOREIGN KEY(workoutName) 
     REFERENCES workouts(workoutName) 
     ON DELETE CASCADE ON UPDATE CASCADE 
); 

參見

[約束[符號]]外鍵
[INDEX_NAME](一個index_col_name,...)
REFERENCES tbl_name(index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]

reference_option:
RESTRICT | CASCADE | SET NULL | NO ACTION

+0

感謝你真是太棒了! @Ravinder – dnuka 2015-03-25 06:34:53

4

外鍵是一種實現不同表格中列之間關係/約束的方法。

有一些影響,當行被更新或從父表中刪除他們是如何執行不同類別的約束:

Cascade:如果行是從父刪除,則在任子行具有匹配FK值的表格也將被刪除。對於父表中的值的更改也是如此。

Restrict如果這會破壞子表的FK約束,則無法從父表中刪除行。對於父表中的值的更改也是如此。

No Action:與「Restrict」非常相似,只是在執行約束之前將執行父表上的任何事件/觸發器 - 爲應用程序編寫器提供使用存儲過程解決任何FK約束衝突的選項。

Set NULL如果NULL是子表中FK列的允許值,那麼如果更新或刪除父表中的關聯數據,則它將設置爲NULL。

Set Default:如果在子表中有FK列的默認值,那麼將在父表中的關聯數據被更新或刪除時使用它。請注意,在此版本中未實現 - 約束可以添加到模式中,但對父表中的列進行任何後續刪除或更新都將失敗。

25

如果你想了解,爲什麼這個錯誤是,所有你需要做的就是運行以下命令來查看「國外最新鍵錯誤

命令來運行: -

mysql> SHOW ENGINE INNODB STATUS 

你會知道你的這種錯誤的原因。

+1

謝謝,這有很大的幫助! – 2015-10-07 20:16:42

+1

@John Cargo我一直這樣做,做到這一點,做到這一點,沒有任何反應。我不知道我是否在錯誤的地方運行它。 – FrostyStraw 2015-12-04 08:26:39

+0

它應該返回'status'消息。當你運行上面的代碼時,你可以讓我知道什麼是輸出? – 2015-12-04 22:13:22

0

我沒有回答上述問題,只是針對會遇到相同mysql錯誤的人。

我所做的只是將引用的表引擎更改爲innodb。

3

由於表TYPE(InnoDB,MyISAM,..)不匹配,有時您會收到此錯誤「#1215 - 無法添加外鍵約束」。

因此改變你的表型爲同一,並嘗試申請外鍵約束

mysql> ALTER TABLE table_name ENGINE=InnoDB;

mysql> ALTER TABLE Orders ADD FOREIGN KEY (P_Id) REFERENCES Persons(P_Id)

1

我得到了同樣的錯誤。原因是我指的是使用字符集latin創建的表中使用charset utf8創建的表中的列。

使用mySQL工作臺創建的表工具創建的表具有默認的字符集拉丁文。

如果您使用的是工作臺,可以輕鬆找到這一點的方法是查看任何表的create table語句。您將在末尾具有默認字符集字符串。

2

這可能適用於某些人。只需添加默認的字符集爲UTF8

DEFAULT CHARACTER SET = utf8; 
+0

+1 - 這是我的問題。原因是如果你有一個字符串類型的字段引用一個字符串類型的字段,它只能將兩個索引鏈接在一起,如果他們使用相同的字符集。在我的情況下,其中一個表使用utf8,另一個使用latin1,所以將其改爲utf8解決了這個問題。 – Jules 2017-12-26 04:32:51

相關問題