2010-01-04 56 views
0

我越來越想添加一個外鍵contraint當這個錯誤:錯誤當創建一個外鍵

#1005 - Can't create table './testtable/#sql-595_146.frm' (errno: 150) 

我需要做一個ON DELETE CASCADE的共享項目ID的所有圖像時項目被刪除。我的簡化表結構如下:

CREATE TABLE IF NOT EXISTS `images` (
`image_id` mediumint(8) unsigned NOT NULL auto_increment, 
`project_id` smallint(6) NOT NULL, 
PRIMARY KEY (`image_id`), 
KEY `project_id_ix` (`project_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=28 ; 

CREATE TABLE IF NOT EXISTS `projects` (
`project_id` smallint(5) unsigned NOT NULL auto_increment, 
PRIMARY KEY (`project_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ; 

現在,當我運行下面的查詢來添加約束時,查詢失敗,出現上述錯誤。誰能幫忙?

ALTER TABLE `images` ADD CONSTRAINT `project_id_fk` FOREIGN KEY (`project_id`) REFERENCES `projects` (`project_id`) ON DELETE CASCADE; 

非常感謝!

+0

如果MySQL從CREATE TABLE語句報告錯誤編號1005,並且錯誤消息引用了錯誤150,表創建失敗,因爲外鍵約束未正確形成:http://dev.mysql.com/doc/ refman/5.1/en/innodb-foreign-key-constraints.html – 2010-01-04 21:47:07

+0

^是的男人,我知道錯誤說什麼。我無法弄清楚的是我的錯誤在哪裏。這就是爲什麼我要求幫助 – user239237 2010-01-04 21:52:41

回答

1

project_id列更改爲具有相同大小smallint(6)(或5)。您還需要使它們都有符號或無符號。

...從MySQL的網站,它說:外鍵和引用的密鑰必須在InnoDB類似的內部數據類型

對應的字段,以便他們可以不用類型轉換比較。整數類型的大小和符號必須相同。字符串類型的長度不需要相同。對於非二進制(字符)字符串列,字符集和歸類必須相同。

+0

它也簽署在一個表中,並在另一個表中籤名。 – Powerlord 2010-01-04 21:51:37

+0

在我收到你的評論之前發現。謝謝 – munch 2010-01-04 21:52:34

+0

修復它!我從來沒有抓到過!謝謝您的幫助! – user239237 2010-01-04 21:59:08

1

我認爲需要匹配的數據類型。 project_id在一個表中是smallint(6),在另一個表中是smallint(5)。

+0

蒙克擊敗了我。前兩天剛剛有這個錯誤,並發現他發佈相同的blurb = D – decompiled 2010-01-04 21:56:58

+0

這就是它!謝謝您的幫助! – user239237 2010-01-04 21:58:29

1

不應該project_id都是smallint(6)

+0

Bah。沒有收到「新消息」彈出窗口。舊消息。 – Satanicpuppy 2010-01-04 21:58:50