2015-05-25 34 views
2

我知道有關於此問題的其他幾個帖子,但他們通常有一個明顯的原因。我看不出我的代碼有什麼問題。無法添加外鍵約束 - MySQL工作臺

我曾嘗試:

  • 確保ENGINE = INNODB。
  • 確保使用相同的數據類型。
  • 刪除代碼並僅測試發生錯誤的表。

以下是代碼。有兩個表,DESSERT和OFFER。我在OFFER中創建了兩個與DESSERT中的主鍵相對應的外鍵。

重要的事實:

  • 我可以評論掉第二外鍵(對應於 DESSERT_DATE),和代碼運行。第一個外鍵創建 我沒有問題。

感謝您的幫助。

CREATE TABLE DESSERT (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
DESSERT_DESCR VARCHAR(160), 
DESSERT_NAME VARCHAR(10), 
DRINK_NAME VARCHAR(26), 
TOPPING_NAME VARCHAR(26), 
DESSERT_PRICE_AMOUNT NUMERIC(6, 2), 

PRIMARY KEY(DESSERT_DATE, DESSERT_CODE) 
); 


CREATE TABLE OFFER (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
RESTAURANT_ID VARCHAR(30) NOT NULL, 

PRIMARY KEY(DESSERT_CODE, DESSERT_DATE, RESTAURANT_ID), 
FOREIGN KEY (DESSERT_CODE) REFERENCES DESSERT(DESSERT_CODE), 
FOREIGN KEY (DESSERT_DATE) REFERENCES DESSERT(DESSERT_DATE) 
); 

編輯:所以使外鍵組合和改變順序做了伎倆。

+0

數據庫表已經創建,或者您需要創建? –

+0

創建了DESSERT表。由於錯誤,OFFER無法創建。 – Blackb3ard

+0

雅其有bcz你不能創建表(OFFER)沒有ID或主鍵 –

回答

1

如果你想分開外鍵,您需要DESSERT_CODE在甜品表中添加唯一鍵(但是它可能有完全不同的意思)

這工作:

CREATE TABLE DESSERT (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
DESSERT_DESCR VARCHAR(160), 
DESSERT_NAME VARCHAR(10), 
DRINK_NAME VARCHAR(26), 
TOPPING_NAME VARCHAR(26), 
DESSERT_PRICE_AMOUNT NUMERIC(6 , 2), 
PRIMARY KEY (DESSERT_DATE , DESSERT_CODE), 
UNIQUE KEY (DESSERT_CODE) 
); 


CREATE TABLE OFFER (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
RESTAURANT_ID VARCHAR(30) NOT NULL, 
PRIMARY KEY (DESSERT_CODE , DESSERT_DATE , RESTAURANT_ID), 
FOREIGN KEY (DESSERT_CODE) 
    REFERENCES DESSERT (DESSERT_CODE), 
FOREIGN KEY (DESSERT_DATE) 
    REFERENCES DESSERT (DESSERT_DATE) 
); 

,或者您需要確保您在外鍵中使用了兩個列,因爲Misandrist已經回答了。

CREATE TABLE DESSERT (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
DESSERT_DESCR VARCHAR(160), 
DESSERT_NAME VARCHAR(10), 
DRINK_NAME VARCHAR(26), 
TOPPING_NAME VARCHAR(26), 
DESSERT_PRICE_AMOUNT NUMERIC(6 , 2), 
PRIMARY KEY (DESSERT_DATE , DESSERT_CODE) 
); 


CREATE TABLE OFFER (
DESSERT_CODE VARCHAR(10) NOT NULL, 
DESSERT_DATE VARCHAR(40) NOT NULL, 
RESTAURANT_ID VARCHAR(30) NOT NULL, 
PRIMARY KEY (DESSERT_CODE , DESSERT_DATE , RESTAURANT_ID), 
FOREIGN KEY (DESSERT_DATE , DESSERT_CODE) 
    REFERENCES DESSERT (DESSERT_DATE , DESSERT_CODE) 
); 
+0

你能解釋爲什麼訂單在複合外鍵中重要嗎? – Blackb3ard

+0

外鍵需要索引,列的順序很重要。對於第二列的搜索,組合索引無用,因爲sql不知道從哪裏開始。 – Tim3880

2

我覺得你真正需要的是:

CREATE TABLE OFFER (
    DESSERT_CODE VARCHAR(10) NOT NULL, 
    DESSERT_DATE VARCHAR(40) NOT NULL, 
    RESTAURANT_ID VARCHAR(30) NOT NULL, 

    PRIMARY KEY(DESSERT_DATE, DESSERT_CODE, RESTAURANT_ID), 
    FOREIGN KEY (DESSERT_DATE, DESSERT_CODE) REFERENCES DESSERT(DESSERT_DATE, DESSERT_CODE) 
); 

由於主鍵是複合鍵,所有外鍵引用它也必須是複合材料。

+0

我試過了,它沒有辦法。此外,我可以將它變成一個外鍵,即刪除DESSERT_DATE。代碼將運行。當我嘗試使DESSERT_DATE成爲外鍵時,會發生該錯誤。 – Blackb3ard

+0

我編輯了答案,使其具有相同的密鑰順序。你有什麼特別的錯誤? – Misandrist

+0

它只告訴我「錯誤代碼:1215.無法添加外鍵約束」。 – Blackb3ard

0
SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 

CREATE TABLE IF NOT EXISTS `mydb`.`DESSERT` (
    `DESSERT_CODE` INT(11) NOT NULL, 
    `DESSERT_DATE` VARCHAR(45) NOT NULL, 
    `DESSERT_DESCR` VARCHAR(45) NULL DEFAULT NULL, 
    `DESSERT_NAME` VARCHAR(45) NULL DEFAULT NULL, 
    PRIMARY KEY (`DESSERT_CODE`, `DESSERT_DATE`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_general_ci; 

CREATE TABLE IF NOT EXISTS `mydb`.`OFFER` (
    `id` INT(11) NOT NULL, 
    `DESSERT_DESSERT_CODE` INT(11) NOT NULL, 
    `DESSERT_DESSERT_DATE` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `fk_OFFER_DESSERT_idx` (`DESSERT_DESSERT_CODE` ASC, `DESSERT_DESSERT_DATE` ASC), 
    CONSTRAINT `fk_OFFER_DESSERT` 
    FOREIGN KEY (`DESSERT_DESSERT_CODE` , `DESSERT_DESSERT_DATE`) 
    REFERENCES `mydb`.`DESSERT` (`DESSERT_CODE` , `DESSERT_DATE`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_general_ci; 


SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

mydb應該更換你的數據庫名稱

+0

只需創建您的數據庫,並在修改後的** Query Window **中運行以上代碼。 –