2010-06-03 68 views
3

這讓我流汗 - 當我嘗試在mySQL中創建一個表時,出現錯誤150。我搜索了論壇無濟於事。該語句使用外鍵約束 - 兩個表都是InnoDB,所有相關的列都具有相同的數據類型,並且兩個表都具有相同的字符集和歸類。以下是正在引用的表的CREATE TABLE和原始CREATE TABLE語句。有任何想法嗎?錯誤沒有150 mySQL

新表:

CREATE TABLE `approval` (
    `rev_id` int(10) UNSIGNED NOT NULL, 
    `rev_page` int(10) UNSIGNED NOT NULL, 
    `user_id` int(10) UNSIGNED NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`rev_id`,`rev_page`,`user_id`), 
    KEY `FK_approval_user` (`user_id`), 
    CONSTRAINT `FK_approval_revision` FOREIGN KEY (`rev_id`, `rev_page`) REFERENCES `revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

參考表:

CREATE TABLE `revision` (
    `rev_id` int(10) unsigned NOT NULL auto_increment, 
    `rev_page` int(10) unsigned NOT NULL, 
    `rev_text_id` int(10) unsigned NOT NULL, 
    `rev_comment` tinyblob NOT NULL, 
    `rev_user` int(10) unsigned NOT NULL default '0', 
    `rev_user_text` varbinary(255) NOT NULL default '', 
    `rev_timestamp` binary(14) NOT NULL default '\0\0\0\0\0\0\0\0\0\0\0\0\0\0', 
    `rev_minor_edit` tinyint(3) unsigned NOT NULL default '0', 
    `rev_deleted` tinyint(3) unsigned NOT NULL default '0', 
    `rev_len` int(10) unsigned default NULL, 
    `rev_parent_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`rev_id`), 
    UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`), 
    KEY `rev_timestamp` (`rev_timestamp`), 
    KEY `page_timestamp` (`rev_page`,`rev_timestamp`), 
    KEY `user_timestamp` (`rev_user`,`rev_timestamp`), 
    KEY `usertext_timestamp` (`rev_user_text`,`rev_timestamp`) 
) ENGINE=InnoDB AUTO_INCREMENT=4904 DEFAULT CHARSET=binary MAX_ROWS=10000000 AVG_ROW_LENGTH=1024; 
+1

你確實是有CREATE TABLE權限,對吧? – Matchu 2010-06-03 15:03:54

回答

2

更新:我一定是瞎了眼:

之所以你創建表失敗,系統是因爲你的 「rev_page_id」密鑰的順序是錯誤的(innodb要求密鑰的順序與外鍵相同:

CREATE TABLE `revision` (
    `rev_id` int(10) unsigned NOT NULL auto_increment, 
    .... 
    `rev_parent_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`rev_id`), 
    -- wrong: 
    -- UNIQUE KEY `rev_page_id` (`rev_page`,`rev_id`), 
    -- better: 
    UNIQUE KEY `rev_page_id` (`rev_id`, `rev_page`), 
    .... 

請忽略以下建議:


嘗試

SHOW ENGINE INNODB STATUS 

查找不便。像「最後INNODB外國關鍵錯誤」 不幸的是,錯誤信息大多數時間不是很直觀。既然你說的類型都是一樣的,我猜可能是以下錯誤:

  • FK名稱已經存在(FK名稱必須是唯一的跨數據庫)。是真的,他們必須對整個MySQL實例唯一的,但在內部InnoDB的增加數據庫名稱爲外鍵的名稱(FK_approval_user在內部調用yourdbname#FK_approval_user)

更新:

它看起來像你缺少的「FK_approval_revision」

的關鍵應該是這樣的:

CREATE TABLE `approval` (
    `rev_id` int(10) UNSIGNED NOT NULL, 
    `rev_page` int(10) UNSIGNED NOT NULL, 
    `user_id` int(10) UNSIGNED NOT NULL, 
    `date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`rev_id`,`rev_page`,`user_id`), 
    KEY `FK_approval_user` (`user_id`), 
    KEY `FK_approval_revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_revision` FOREIGN KEY (`rev_id`, `rev_page`) REFERENCES `revision` (`rev_id`, `rev_page`), 
    CONSTRAINT `FK_approval_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
4

此錯誤通常與外鍵約束。執行show innodb status並查找最新的外鍵錯誤部分以獲得更具體的解釋。

這是我得到創建第二個表時:如果更改約束定義列的順序

Error in foreign key constraint of table test/approval: FOREIGN KEY (rev_id , rev_page) REFERENCES revision (rev_id , rev_page),
CONSTRAINT FK_approval_user FOREIGN KEY (user_id) REFERENCES user (user_id)) ENGINE=InnoDB DEFAULT CHARSET=latin1: Cannot find an index in the referenced table where the referenced columns appear as the first columns, or column types in the table and the referenced table do not match for constraint.

1

它會工作:

FOREIGN KEY (`rev_page`,`rev_id`) REFERENCES `revision` (`rev_page`,`rev_id`) 

原始查詢不起作用因爲字段的順序必須與唯一索引中的順序相同。但是,將rev_page列添加到約束是多餘的(revision.rev_id + revision.rev_page是100%唯一的,沒有唯一約束,因爲revision.rev_id本身是唯一的)。所以,你不需要在(revision.rev_id + revision.rev_page)唯一鍵,如果你改變你的約束

FOREIGN KEY (`rev_id`) REFERENCES `revision` (`rev_id`) 
+0

感謝alex07釘住它。 Matchu - 是的,我確實有CREATE TABLE privs!在任何情況下,錯誤150都與權限無關。 – buddhamagnet 2010-06-03 15:21:32

0

顯示InnoDB的狀態

這CMD有很大的幫助它會好得多