2015-12-03 12 views
0

舊電腦:MySQL版本5.0.51MySQL曾經允許一個CHAR列到FK到另一個表的ENUM列,但不再是?

新計算機:MySQL版本5.7.9

DDL剪斷:

CREATE TABLE lookup (
    keyvalue ENUM ('A', 'B', 'C', 'D') NOT NULL; 
    CONTSTRAINT lookuppk PRIMARY KEY (keyvalue) 
); 

CREATE TABLE othertable (
    otherkey INT(5) NOT NULL AUTO_INCREMENT, 
    refkey CHAR(1), 
    CONSTRAINT otherpk PRIMARY KEY (otherkey), 
    CONSTRAINT reffk FOREIGN KEY (refkey) REFERENCES lookup(keyvalue) 
); 

結果時,舊計算機上運行:沒問題

結果當在新計算機上運行時:錯誤1215(HY000):無法添加外鍵約束

這是一個實驗數據庫只在我的家用機器上運行,而不是工作或現實生活中的任何東西。我最初是在四年前做過這件事的,而且我正在開始將東西遷移到新購買的家用電腦上。

錯誤似乎只是一個FK必須匹配引用列的數據類型正好。事後看來,這是一個糟糕的設計,我年紀大了,而且我可以改變。但是我好奇的是,爲什麼一個較老的MySQL版本允許這樣做。我查看了文檔,但找不到任何東西。

+0

在CREATE TABLE語句中沒有定義任何引擎。看看是否是默認的MyISAM。然後改變它InnoDB。 –

回答

2

就像Bernd Buffen已經提到的那樣,最有可能在您的舊計算機上使用MyISAM引擎,這是當時的標準。 MyISAM默默地忽略關於外鍵的任何規範,因爲它沒有,並且仍然不支持它們。當你改變你的桌子

ALTER TABLE <table name> ENGINE=InnoDB; 

你會在你的舊電腦上得到同樣的錯誤。

您也可以使用此查詢來驗證一下:

show variables like '%storage%'; 

在MySQL 5.7它可能會顯示:

+----------------------------+--------+ 
| Variable_name    | Value | 
+----------------------------+--------+ 
| default_storage_engine  | InnoDB | 
| default_tmp_storage_engine | InnoDB | 
| storage_engine    | InnoDB | 
+----------------------------+--------+ 

而在MySQL 5.0將顯示的MyISAM。

相關問題