2014-02-11 261 views
6

我似乎在設置兩張表格之間的Foreign Key時遇到問題。在<ColumName>上創建外鍵時出錯(檢查數據類型)

下面是每個表的CREATE子句:

CREATE TABLE IF NOT EXISTS `dbname`.`CallRecord` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `user_id` INT NOT NULL, 
    `city_id` INT NOT NULL, 
    `created` DATETIME NULL, 
    `timestamp` TIMESTAMP NULL, 
    PRIMARY KEY (`id`), 
    INDEX `user_id_fk_idx` (`user_id` ASC), 
    INDEX `city_id_fk_idx` (`city_id` ASC), 
    CONSTRAINT `user_id_fk` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `dbname`.`User` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE NO ACTION, 
    CONSTRAINT `city_id_fk` 
    FOREIGN KEY (`city_id`) 
    REFERENCES `dbname`.`City` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

這裏是另一個表:

CREATE TABLE IF NOT EXISTS `dbname`.`DataCallAssoc` (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `data_id` INT NOT NULL, 
    `call_record_id` INT NOT NULL, 
    PRIMARY KEY (`id`), 
    INDEX `data_id_fk_idx` (`data_id` ASC), 
    INDEX `call_record_id_fk_idx` (`call_record_id` ASC), 
    CONSTRAINT `data_id_fk` 
    FOREIGN KEY (`data_id`) 
    REFERENCES `dbname`.`Data` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION, 
    CONSTRAINT `call_record_id_fk` 
    FOREIGN KEY (`call_record_id`) 
    REFERENCES `dbname`.`CallRecord` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

問題在於最後DataCallAssocCONSTRAINT

CONSTRAINT `call_record_id_fk` 
    FOREIGN KEY (`call_record_id`) 
    REFERENCES `dbname`.`CallRecord` (`id`) 
    ON DELETE CASCADE 
    ON UPDATE NO ACTION) 

我得到這個錯誤:

Error creating foreign key on call_record_id (check data types)

即使當我創建表和單獨的外鍵。其他每個外鍵都可以工作,甚至可以指向CallRecord.id作爲外鍵工作的其他表。

我還檢查了CallRecord.idDataCallAssoc.call_record_id的結構相同。

回答

1

我能夠重新在我的本地主機你的表,我刪除這從第一create,因爲你沒有顯示USERCity表的結構,所以錯誤應該有

CONSTRAINT `user_id_fk` 
    FOREIGN KEY (`user_id`) 
    REFERENCES `dbname`.`User` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE NO ACTION, 
    CONSTRAINT `city_id_fk` 
    FOREIGN KEY (`city_id`) 
    REFERENCES `dbname`.`City` (`id`) 
    ON DELETE RESTRICT 
    ON UPDATE NO ACTION) 

這就是我使用的原因。

CREATE TABLE IF NOT EXISTS `CallRecord` (
     `id` INT NOT NULL AUTO_INCREMENT, 
     `user_id` INT NOT NULL, 
     `city_id` INT NOT NULL, 
     `created` DATETIME NULL, 
     `timestamp` TIMESTAMP NULL, 
     PRIMARY KEY (`id`), 
     INDEX `user_id_fk_idx` (`user_id` ASC), 
     INDEX `city_id_fk_idx` (`city_id` ASC) 
    ) 
    ENGINE = InnoDB 


    CREATE TABLE IF NOT EXISTS `DataCallAssoc` (
     `id` INT NOT NULL AUTO_INCREMENT, 
     `data_id` INT NOT NULL, 
     `call_record_id` INT NOT NULL, 
     PRIMARY KEY (`id`), 
     INDEX `data_id_fk_idx` (`data_id` ASC), 
     INDEX `call_record_id_fk_idx` (`call_record_id` ASC), 
     CONSTRAINT `call_record_id_fk` 
     FOREIGN KEY (`call_record_id`) 
     REFERENCES `CallRecord` (`id`) 
     ON DELETE CASCADE 
     ON UPDATE NO ACTION) 
    ENGINE = InnoDB 

enter image description here

26

的錯誤創建外鍵...(檢查數據類型)如果你已經有同名的另一個表的外鍵也會發生錯誤。因此,如果遇到這個最無用的錯誤消息,請確保您的數據類型匹配,並且外鍵名稱也是唯一的。希望這可以幫助某人。

+2

我不知道這一點。只需讓phpMyAdmin自動生成一個約束名稱就可以了嗎? – gwg

+3

只要你一直使用自動生成的名字(保留fk字段爲空),那麼你將不會有一個交叉表「衝突」,因爲phpMyAdmin在當前表的前綴名稱,然後將fk號碼添加到結束。所以基本上:不,我不認爲你會遇到這種特殊的錯誤情況。另一方面,它可能會使更難以排除故障,因爲你的外鍵沒有被更簡潔/刻意地命名。 – ademup

+0

好的。在使用表前綴時,我可以將外鍵重命名爲更易讀的內容。我沒有添加前綴,這是我在這裏找到的。 – gwg

7

除了確保數據類型相同之外,對於某些類型,例如bigint(20),如果主鍵未經簽名,則外鍵也必須是未簽名的。 「無符號」是一個字段的屬性之一。

+0

男人,你救了我的一天。謝謝 –

+0

救了我的一天!謝謝你,小夥伴! – Pun