我似乎在設置兩張表格之間的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;
問題在於最後DataCallAssoc
的CONSTRAINT
:
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.id
與DataCallAssoc.call_record_id
的結構相同。
我不知道這一點。只需讓phpMyAdmin自動生成一個約束名稱就可以了嗎? – gwg
只要你一直使用自動生成的名字(保留fk字段爲空),那麼你將不會有一個交叉表「衝突」,因爲phpMyAdmin在當前表的前綴名稱,然後將fk號碼添加到結束。所以基本上:不,我不認爲你會遇到這種特殊的錯誤情況。另一方面,它可能會使更難以排除故障,因爲你的外鍵沒有被更簡潔/刻意地命名。 – ademup
好的。在使用表前綴時,我可以將外鍵重命名爲更易讀的內容。我沒有添加前綴,這是我在這裏找到的。 – gwg