2017-08-14 81 views
0

我必須創建和使用類項目的數據庫。我使用mysql工作臺在本地開發了數據庫和應用程序。它需要託管在另一個名爲myphpmyadmin的服務上。問題是當我使用該服務中的mysql執行行創建我的表時,出現以下錯誤。MySql查詢錯誤150拼圖

Error 
SQL query: 

CREATE TABLE IF NOT EXISTS `artists_residence` (

`artists_id` INT(11) , 
`city_id` INT(11) , 
PRIMARY KEY ( `artists_id` , `city_id`) , 
CONSTRAINT FOREIGN KEY ( `artists_id`) REFERENCES `artists` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE , 
CONSTRAINT FOREIGN KEY ( `city_id`) REFERENCES `city` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE = INNODB CHARSET = Latin1; 

MySQL said: Documentation 

#1005 - Can't create table 'fondellb-db.artists_residence' (errno: 150) 

這是我試圖執行的mySql的整個文件。

CREATE TABLE IF NOT EXISTS `artists` (
    `id` INT(11) NOT NULL AUTO_INCREMENT, 
    `fname` VARCHAR(255) NOT NULL, 
    `lname` VARCHAR(255) NOT NULL, 
    `year_of_birth` DATE NOT NULL, 
    `year_of_death` DATE NULL DEFAULT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `country` (
    `country_id` INT(11) NOT NULL, 
    `name` VARCHAR(45) NOT NULL, 
    PRIMARY KEY (`country_id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `city` (
    `id` INT(11) NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    `fk_country_id` INT(11), 
    PRIMARY KEY (`id`, `fk_country_id`), 
    CONSTRAINT `country_id` 
    FOREIGN KEY (`fk_country_id`) 
    REFERENCES `country` (`country_id`) 
    ON DELETE RESTRICT 
    ON UPDATE RESTRICT) 
ENGINE = InnoDB CHARSET = Latin1; 

CREATE TABLE IF NOT EXISTS `Medium` (
    `id` INT(11) NOT NULL, 
    `name` VARCHAR(255) NOT NULL, 
    PRIMARY KEY (`id`)) 
ENGINE = InnoDB CHARSET = Latin1; 


CREATE TABLE IF NOT EXISTS `artists_medium` (
    `artists_id` INT(11), 
    `medium_id` INT(11), 
    PRIMARY KEY (`artists_id`, `medium_id`), 
    CONSTRAINT 
    FOREIGN KEY (`artists_id`) 
    REFERENCES `artists` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT 
    FOREIGN KEY (`medium_id`) 
    REFERENCES `Medium` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB CHARSET = Latin1; 

CREATE TABLE IF NOT EXISTS `artists_residence` (
    `artists_id` INT(11), 
    `city_id` INT(11), 
    PRIMARY KEY (`artists_id`, `city_id`), 
    CONSTRAINT 
    FOREIGN KEY (`artists_id`) 
    REFERENCES `artists` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE, 
    CONSTRAINT 
    FOREIGN KEY (`city_id`) 
    REFERENCES `city` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE CASCADE) 
ENGINE = InnoDB CHARSET = Latin1; 

我無法弄清楚什麼是最終查詢失敗。所有其他查詢都成功並創建表。我在各種變化中擺弄這個查詢,似乎沒有什麼能解決這個錯誤。我刪除了顯式索引,我改變了約束的順序,檢查了所有類型的比較。這是一個基於我設計的模型導出的文件,所以我不知道爲什麼現在我收到這個錯誤。請不要將我引用到錯誤代碼的引用或另一個接收此錯誤代碼的帖子,我知道什麼會導致錯誤,但我想知道是什麼導致它在這裏。

+0

我喜歡首先構造表和索引,然後添加約束條件 – Strawberry

回答

0

在這種情況下 - 你創建以下外鍵

CONSTRAINT FOREIGN KEY ( `city_id`) REFERENCES `city` ( `id`) ON DELETE CASCADE ON UPDATE CASCADE 

city表沒有一個id主鍵,而是一個複合主鍵。

顯然,2的唯一一列不能保證值的唯一性,因此mysql限制你創建一個這樣的FK。

因此,您必須更改city的PK或artists_residence的FK。

+0

好吧,當我設置城市PK爲('id')而不是('id','fk_country_id')我得到相同的錯誤仍然。我不完全確定如何解決這個參考。 – benpaul

+1

@benpaul嘗試逐個添加字段/約束,直到失敗。那麼你確切知道它爲什麼會失敗。 – zerkms