簡體   English   中英

MySQL外鍵錯誤:無法創建表

[英]MySQL Foreign Key Error: Can't create table

我試圖在MySQL數據庫中創建兩個名為class_membershistory 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM