[英]MySQL Foreign Key Error: Can't create table
我試圖在MySQL數據庫中創建兩個名為class_members
和history
。 class_members
表包含有關成員的信息,並創建為:
CREATE TABLE `class_members` (
`id` int(11) NOT NULL,
`username` varchar(65) NOT NULL DEFAULT '',
`password` varchar(65) NOT NULL DEFAULT '',
`email` varchar(65) NOT NULL,
`mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `email_UNIQUE` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
class_members
表已成功創建。
創建包含對class_members
foreign key
引用的history
表時,我遇到了問題。
我使用的命令如下:
CREATE TABLE `History` (
`history_id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(65) NOT NULL DEFAULT '',
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` VARCHAR(20) NOT NULL,
PRIMARY KEY (`history_id`),
CONSTRAINT `fk_history_member` FOREIGN KEY (`username`)
REFERENCES `class_members` (`username`)
ON UPDATE CASCADE);
當我執行以上命令時,出現此錯誤:
ERROR 1005 (HY000): Can't create table 'testDB.History' (errno: 150)
我試圖找到為什么我無法讀取History
表( 關於錯誤1005 ),但我不明白為什么
在評論之后,我創建了一個新數據庫,並嘗試使用上述命令進行創建,但仍然出現錯誤。 見附件圖片
更新(已解決)
我發現了為什么上面的屏幕截圖中出現錯誤。 為了解決這個問題,我們必須在歷史記錄表創建命令的末尾添加ENGINE=InnoDB DEFAULT CHARSET=utf8
。
CREATE TABLE `History` (
`history_id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(65) NOT NULL DEFAULT '',
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` VARCHAR(20) NOT NULL,
PRIMARY KEY (`history_id`),
CONSTRAINT `fk_history_member` FOREIGN KEY (`username`)
REFERENCES `class_members` (`username`)
ON UPDATE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8;
這很完美。
您的查詢適用於rextester 。
確保您還沒有名為history
的現有表。 如果我重新創建history
表,則會得到:
無法刪除或更新父行:外鍵約束失敗
您可以通過運行一次rextester
查詢來重現此rextester
,然后drop table if exists history;
,則刪除drop table if exists history;
行,然后再次運行。
如果您嘗試在同一批次中兩次創建表,則會得到以下信息:
表“歷史”已存在
我認為您的問題出在索引的起源。 以這種方式嘗試代碼;
CREATE TABLE `class_members` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(65) NOT NULL DEFAULT '',
`password` varchar(65) NOT NULL DEFAULT '',
`email` varchar(65) NOT NULL,
`mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `username_UNIQUE` (`username`),
UNIQUE KEY `id_UNIQUE` (`id`),
UNIQUE KEY `email_UNIQUE` (`email`),
INDEX `index_username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `History` (
`history_id` INT(11) NOT NULL AUTO_INCREMENT,
`username` VARCHAR(65) NOT NULL DEFAULT '',
`timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`ip` VARCHAR(20) NOT NULL,
PRIMARY KEY (`history_id`),
CONSTRAINT `fk_history_member` FOREIGN KEY (`username`)
REFERENCES `class_members` (`username`)
ON UPDATE CASCADE);
對於SQLFiddle示例; 點擊這里
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.