2012-03-04 89 views
0

我在mysql上獲得另一個errno 150。我已經看過表引擎,列類型,但沒有運氣,在我看來它沒有錯。無法在Mysql上創建表errno:150

這次我會出錯嗎?

我在創建與image_tag和tag_lang相關的標記表時出錯。對於MySQL錯誤150顯示

-- ----------------------------------------------------- 
-- Table `ratna`.`image_tag` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `ratna`.`image_tag` ; 

CREATE TABLE IF NOT EXISTS `ratna`.`image_tag` (
    `id` INT(11) NOT NULL , 
    `tag` INT(11) NOT NULL , 
    PRIMARY KEY (`id`, `tag`) , 
    INDEX `image_fk` (`id` ASC) , 
    CONSTRAINT `image_fk` 
    FOREIGN KEY (`id`) 
    REFERENCES `ratna`.`image` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8; 


-- ----------------------------------------------------- 
-- Table `ratna`.`tag_lang` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `ratna`.`tag_lang` ; 

CREATE TABLE IF NOT EXISTS `ratna`.`tag_lang` (
    `id` INT(11) NOT NULL , 
    `lang` INT(20) NOT NULL , 
    `tag_desc` VARCHAR(200) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL , 
    PRIMARY KEY (`id`, `lang`)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_general_ci; 


-- ----------------------------------------------------- 
-- Table `ratna`.`tag` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `ratna`.`tag` ; 

CREATE TABLE IF NOT EXISTS `ratna`.`tag` (
    `id` INT(11) NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(50) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL , 
    `seq` INT(11) NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `image_tag_fk` (`id` ASC) , 
    INDEX `tag_lang` (`id` ASC) , 
    CONSTRAINT `image_tag_fk` 
    FOREIGN KEY (`id`) 
    REFERENCES `ratna`.`image_tag` (`tag`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT `tag_lang` 
    FOREIGN KEY (`id`) 
    REFERENCES `ratna`.`tag_lang` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB 
AUTO_INCREMENT = 13 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_general_ci; 
+0

哪個MySQL版本? – Phil 2012-03-04 03:17:25

+0

mysql版本:5.1.41 – 2012-03-04 03:21:03

回答

4

此:

REFERENCES `ratna`.`image_tag` (`tag`) 

是無效的,因爲image_tag不具有與tag開頭的指數。正如解釋的in the documentation

InnoDB允許一個外鍵引用任何索引列或一組列。但是,在參考表格中,必須有一個索引,其中參考列以相同順序列爲第一個列。

(在這種情況下,「參考表」是image_tag,「參考列」只是tag。)

+0

即時消失了,是不是意味着我需要在表'image_tag'的'tag'上添加索引? – 2012-03-04 03:26:09

+0

這意味着你正試圖定義一個引用'image_tag(tag)'的外鍵,而不在'image_tag(tag)'上有索引。所以,*要麼*您需要放棄擁有外鍵,*或*您需要以某種方式更改其定義,*或*您需要添加一個索引'image_tag(tag)'或'image_tag(標籤,...)'。不知道更多關於您的應用程序的信息,我無法告訴您哪些是正確的選擇。 – ruakh 2012-03-04 03:37:00

1

首款谷歌結果:

如果重新創建已刪除的表,它必須有一個符合引用它的外鍵約束的定義。如前所述,它必須具有正確的列名和類型,並且必須在引用的鍵上有索引。如果這些不滿足,MySQL將返回錯誤號1005並引用錯誤消息中的錯誤150。

如果MySQL從CREATE TABLE語句報告錯誤號1005,並且錯誤消息引用了錯誤150,表創建失敗,因爲外鍵約束未正確形成。同樣,如果一個ALTER TABLE失敗並且引用了錯誤150,那就意味着一個外鍵的定義將不正確地爲修改後的表格形成。您可以使用SHOW ENGINE INNODB STATUS來顯示服務器中最新的InnoDB外鍵錯誤的詳細說明。

http://dev.mysql.com/doc/refman/5.5/en/innodb-foreign-key-constraints.html

+0

我明白了。 在參考表中找不到索引,其中 引用列顯示爲第一列,或表中的列類型 與引用的表不匹配約束。 請注意,在使用> = InnoDB-4.1.12創建的表中,ENUM和SET的內部存儲類型已更改,舊錶 中的這些列不能被新表中的這些列引用。 – 2012-03-04 03:18:11

+0

是這意思,我不能引用主鍵到其他表? – 2012-03-04 03:19:31

0
在我的情況

外鍵(table_column_name_in_smaller_case)的問題引用 primary_key_table_in_upper_case(table_column_name_in_smaller_case)

,因爲我的主鍵表是在較低的情況下,我改變了這種上國外

* primary_key_table_in _upper_case *

* primary_key_table_in_lower_case *

和它的工作

相關問題