2014-04-21 61 views
0

編輯#2: - 以下斯賓塞7593的答案,即沒有外鍵創建表,然後使用alter table語句添加它們後,該表已成功創建併成功添加了外鍵。爲什麼我得到「錯誤代碼1005不能創建c errno 150 mysql」?

但現在我想知道爲什麼? 爲什麼它在我們創建表格時起作用,然後使用alter table聲明添加外鍵約束,而不是當我們在create table聲明中完成所有操作時?


我在我的數據庫中創建了下列表格。前兩個是創建成功,但第三個是給這個錯誤。

我檢查了我的數據庫中的this answer中的點,我可以理解。請告訴我爲什麼我得到這個錯誤。

CREATE TABLE a (
    a_id INT(255) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(5000), 
    code VARCHAR(5000), 
    PRIMARY KEY (a_id) 
); 

CREATE TABLE b (
    b_id INT(255) NOT NULL AUTO_INCREMENT, 
    b_name VARCHAR(5000), 
    PRIMARY KEY (b_id) 
); 

CREATE TABLE c (-- error code 1005 can t create c errno 150 mysql 
    a_id INT(255), -- fk 
    b_id INT(255), -- fk 
    PRIMARY KEY (a_id, b_id), 
    FOREIGN KEY (a_id) 
     REFERENCES a (a_id), 
    FOREIGN KEY (b_id) 
     REFERENCES b(b_id) 
); 

編輯: -

我執行的只是這三個報表中單獨(改變所有INT類型的大小來11後 - 這要歸功於邁克爾Berkowski評論),讓我吃驚,它確實創建表,但給了這個記錄(如果我使用正確的字):

3 4 01:03:49 CREATE TABLE a (
    a_id INT(11) NOT NULL AUTO_INCREMENT, 
    name VARCHAR(5000), 
    code VARCHAR(5000), 
    PRIMARY KEY (a_id) 
) 0 row(s) affected 0.156 sec 
3 5 01:03:54 CREATE TABLE b (
    b_id INT(11) NOT NULL AUTO_INCREMENT, 
    b_name VARCHAR(5000), 
    PRIMARY KEY (b_id) 
) 0 row(s) affected 0.234 sec 
3 6 01:03:58 CREATE TABLE c (-- error code 1005 can t create c errno 150 mysql 
    a_id INT(11), -- fk 
    b_id INT(11), -- fk 
    PRIMARY KEY (a_id, b_id), 
    FOREIGN KEY (a_id) 
     REFERENCES a (a_id), 
    FOREIGN KEY (b_id) 
     REFERENCES b(b_id) 
) 0 row(s) affected 0.203 sec 

這就是所有這三個表都已創建,但在創建第三個表時會返回一個錯誤。


EDIT#3: -

從SHOW輸出CREATE TABLE一個,和SHOW CREATE TABLE B: -

CREATE TABLE `a` (
    `a_id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(5000) DEFAULT NULL, 
    `code` varchar(5000) DEFAULT NULL, 
    PRIMARY KEY (`a_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

CREATE TABLE `b` (
    `b_id` int(11) NOT NULL AUTO_INCREMENT, 
    `b_name` varchar(5000) DEFAULT NULL, 
    PRIMARY KEY (`b_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 
+1

,請發表您使用的是精確的語句。這些看起來像縮寫,並且確實它們正確地工作:http://sqlfiddle.com/#!2/10d9b –

+1

但是單獨地,'INT(255)'是可疑的。您希望這些列包含哪些數據? (請參閱http://stackoverflow.com/questions/7171312/what-is-the-max-number-if-i-store-int255-in-mysql) –

+0

可能的重複[錯誤代碼:1005.無法創建表'...'(errno:150)](http://stackoverflow.com/questions/9018584/error-code-1005-cant-create-table-errno-150) – Mureinik

回答

1

此錯誤的最常見的原因是外鍵列定義與引用列的定義不匹配。錯誤的另一個原因是引用的表中引用的列不存在。

但是OP CREATE TABLE聲明沒有這個問題;那些與MyISAM和InnoDB一起作爲默認存儲引擎。 (不知道任何其他存儲引擎,我們沒有看到一個存儲引擎指定的,我只是猜測,默認或者是InnoDB的或於MyISAM)。

SHOW VARIABLES LIKE 'default_storage_engine' 

要調試這個問題,嘗試運行create table c沒有外鍵約束定義,並驗證表已成功創建。 (長度修飾符值255會使我們感到奇怪,爲什麼不讓它默認爲11?)

CREATE TABLE c 
(a_id INT COMMENT 'FK ref a.a_id' 
, b_id INT COMMENT 'FK ref b.b_id' 
, PRIMARY KEY (a_id, b_id) 
); 

然後嘗試添加外鍵約束:

ALTER TABLE c ADD CONSTRAINT FK_c_a 
FOREIGN KEY (a_id) REFERENCES a (a_id); 

確保列a_id存在於a,並且定義相匹配。如果你正在運行到錯誤(是否有可能將列在表a命名id(而不是a_id)?)

+0

第一個片段(即創建沒有外鍵語句的表)成功創建了表。你能否澄清一下FK_c_a是什麼? – Solace

+0

@Zarah:'CONSTRAINT name'是可選的。在那個例子中,'FK_c_a'是我分配給約束的名稱。我遵循的約定是'FK_' + table_name + referenced_table_name,當該模式有多個FK時,我通常在約束名稱中包含一個* role *。 – spencer7593

+0

這工作得很好。非常感謝你。該表已創建並添加了外鍵。但我想知道爲什麼它不在CREATE TABLE語句中工作 - 更新我的問題! – Solace

相關問題