2013-09-16 29 views
2

我有26個互相依賴的表格。我創建了每個表格,然後通過MySQL Workbench在數據庫中執行。然後我建立了模型,在這個模型中我鏈接了創建外鍵的表。我將它導回到元數據中,並且現在我已經擁有由應用程序創建的正確外部數據的表的完整代碼,所以我沒有犯錯。爲什麼MySQL不接受我的外鍵?

但是,當我把文件放到我的服務器上運行phpMyAdmin,我得到一個150錯誤,沒有指定它在哪裏。我谷歌搜索,但每個案件是不同的,我的是,FK不是自動遞增字段,而是一個字符串字段稱爲UT,我創建了一個時間單位,當我創建一個行。

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`aplicativo` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `nome` VARCHAR(99) NOT NULL , 
    `ver` VARCHAR(20) NULL DEFAULT NULL , 
    `descr` VARCHAR(254) NULL DEFAULT NULL , 
    `tag` VARCHAR(254) NULL DEFAULT NULL , 
    `url` VARCHAR(254) NULL DEFAULT NULL , 
    `cad` VARCHAR(20) NULL DEFAULT NULL , 
    `obj` TEXT NULL DEFAULT NULL , 
    `tab` VARCHAR(254) NULL DEFAULT NULL , 
    `dbn` VARCHAR(254) NULL DEFAULT NULL , 
    `dbu` VARCHAR(254) NULL DEFAULT NULL , 
    `dbs` VARCHAR(254) NULL DEFAULT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `nome` (`nome` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `app` VARCHAR(20) NULL DEFAULT NULL , 
    `lic` VARCHAR(20) NULL DEFAULT NULL , 
    `tipo` VARCHAR(20) NULL DEFAULT NULL , 
    `nome` VARCHAR(99) NOT NULL , 
    `classe` VARCHAR(99) NOT NULL , 
    `obj` TEXT NULL DEFAULT NULL , 
    PRIMARY KEY (`id`) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC)) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) NOT NULL , 
    `app` VARCHAR(20) NOT NULL , 
    `modulo` VARCHAR(20) NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_modulo_app_modulo1` (`modulo` ASC) , 
    INDEX `fk_modulo_app_aplicativo1` (`app` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) , 
    CONSTRAINT `fk_modulo_app_modulo1` 
    FOREIGN KEY (`modulo`) 
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_modulo_app_aplicativo1` 
    FOREIGN KEY (`app`) 
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

奏效(應答後)下表:

CREATE TABLE IF NOT EXISTS `eduardo8_plataforma`.`modulo_app` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT , 
    `ut` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' UNIQUE NOT NULL , 
    `app` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL , 
    `modulo` VARCHAR(20) CHARACTER SET 'utf8' COLLATE 'utf8_swedish_ci' NOT NULL , 
    PRIMARY KEY (`id`) , 
    INDEX `fk_modulo_app_modulo1` (`modulo` ASC) , 
    INDEX `fk_modulo_app_aplicativo1` (`app` ASC) , 
    UNIQUE INDEX `ut_UNIQUE` (`ut` ASC) , 
    CONSTRAINT `fk_modulo_app_modulo1` 
    FOREIGN KEY (`modulo`) 
    REFERENCES `eduardo8_plataforma`.`modulo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_modulo_app_aplicativo1` 
    FOREIGN KEY (`app`) 
    REFERENCES `eduardo8_plataforma`.`aplicativo` (`ut`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB 
DEFAULT CHARACTER SET = utf8 
COLLATE = utf8_swedish_ci; 

回答

4

您需要的外鍵之前移動CREATE INDEX條款,如外鍵不能引用非索引字段。

+0

如何在創建表或創建索引後在表聲明中放置FK聲明? – PSyLoCKe

+0

我試過你說的方式並更新了問題中的代碼,但我仍然得到了150錯誤代碼。 – PSyLoCKe

2

小故事是一個外鍵應引用候選鍵列。也就是說,它應該引用被聲明爲

  • 主鍵列,或
  • 沒有空的唯一。

如果您引用不唯一的列,則標準SQL dbms將引發錯誤。 MySQL也應該,但它不會。

Mysql Docs

。 。 。系統不會強制要求被引用的列爲「唯一」或被聲明爲「非空」。外鍵 對包含NULL值的非唯一鍵或鍵的引用不是 ,對於諸如UPDATE或DELETE CASCADE之類的操作已經定義好了。建議您使用僅引用UNIQUE(包括 PRIMARY)和NOT NULL鍵的外鍵的爲 。

如果您需要來自其他表的非唯一數據,請將其加入查詢中,或將其加入視圖中。

+0

這是UT作爲外鍵的主要索引。 – PSyLoCKe

+0

[Mysql Docs](http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html)說:「系統不強制要求被引用的列是UNIQUE或被聲明爲NOT NULL處理對包含NULL值的非唯一鍵或鍵的外鍵引用對於諸如UPDATE或DELETE CASCADE之類的操作沒有很好的定義,建議使用僅引用UNIQUE(包括PRIMARY)和NOT NULL鍵「。 –

+0

我試過你說的方式並更新了問題中的代碼,但我仍然得到了150錯誤代碼。 – PSyLoCKe

相關問題