2012-04-05 135 views
178

我想將一個外鍵添加到名爲「katalog」的表中。 InnoDB的狀態將外鍵添加到現有表

Error Code: 1005. Can't create table 'mytable.#sql-7fb1_7d3a' (errno: 150) 

錯誤:

ALTER TABLE katalog 
ADD CONSTRAINT `fk_katalog_sprache` 
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

當我嘗試這樣做,我得到這個錯誤信息

120405 14時02分57秒在錯誤表 mytable的外鍵約束。#sql-7fb1_7d3a:

FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL: 
Cannot resolve table name close to: 
(`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL 

當我「上刪除」操作使用此查詢它的工作原理,但有錯:

ALTER TABLE `katalog` 
ADD FOREIGN KEY (`Sprache`) REFERENCES `sprache` (`ID`) 

兩個表是InnoDB和兩個字段是「INT(11)非空」。我正在使用MySQL 5.1.61。嘗試在MacBook Pro上使用MySQL Workbench(最新版本)激發此ALTER查詢。

表創建聲明:

CREATE TABLE `katalog` (
`ID` int(11) unsigned NOT NULL AUTO_INCREMENT, 
`Name` varchar(50) COLLATE utf8_unicode_ci NOT NULL, 
`AnzahlSeiten` int(4) unsigned NOT NULL, 
`Sprache` int(11) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `katalogname_uq` (`Name`) 
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci ROW_FORMAT=DYNAMIC$$ 

CREATE TABLE `sprache` (
`ID` int(11) NOT NULL AUTO_INCREMENT, 
`Bezeichnung` varchar(45) NOT NULL, 
PRIMARY KEY (`ID`), 
UNIQUE KEY `Bezeichnung_UNIQUE` (`Bezeichnung`), 
KEY `ix_sprache_id` (`ID`) 
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 
+1

既然你沒有發佈'SHOW CREATE TABLE'的輸出,我只能問 - 列名真的是ID,大寫? – 2012-04-05 12:09:34

+0

我在上面添加了這個。 – frgtv10 2012-04-05 12:12:52

+0

好吧,現在更容易發現 - 'katalog'具有'int(11)unsigned'。 'sprache'沒有'usigned'部分,所以兩列不一樣。 – 2012-04-05 12:15:32

回答

314

爲了一個外鍵(grade_id)添加到現有的表(用戶),請按照下列步驟操作:

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0; 
ALTER TABLE users ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
+7

理由幫助我理解和記住。這是因爲您無法將外鍵添加到非無符號字段,請更正? – PixMach 2015-09-28 21:25:32

+5

@PixMach,答案是否定的。您可以將整數簽名爲外鍵。作爲N.B.在問題中提到,字段的類型和符號需要匹配。因此,如果查找表中的主鍵是UNSIGNED,那麼外鍵字段也必須是UNSIGNED。如果主鍵字段是SIGNED,那麼外鍵字段也必須簽名。 可以這麼想:無論在哪個表中的列被定義爲在SHOW CREATE TABLE中,它都需要在另一個表中具有相同的定義。 – 2016-09-19 20:38:30

+1

請注意,這也可以通過一個查詢來完成(可能會更好,如果失敗等) – 2016-12-03 15:19:10

3

當您添加一個外鍵約束使用ALTER TABLE表,記得先創建所需的索引。

  1. 創建索引
  2. 修改表
+0

我爲兩者創建了索引。當我嘗試運行時,我得到和以前一樣的錯誤信息。當我放棄「關於更新刪除」部分它的作品,但與錯誤的「刪除」行爲;) – frgtv10 2012-04-05 12:32:48

+0

@ frgtv10最有可能的表數據與「刪除」衝突。 – 2012-04-05 12:43:10

13

檢查這個環節。它幫助我與errno 150: http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/

在我的頭頂上想到兩件事情。

  • 您的外鍵索引是整個數據庫(列表中的#3)的唯一名稱嗎?
  • 你是否試圖在更新(列表中的#5)上將表PK設置爲NULL?

我猜測問題是在更新時設置NULL(如果我的大腦不在今天倒退,因爲他們經常是......)。

編輯:我錯過了您的原帖的評論。未簽名/未簽名的int列可能會解決您的問題。希望我的鏈接可以幫助未來的人思考。

10
FOREIGN KEY (`Sprache`) 
REFERENCES `Sprache` (`ID`) 
ON DELETE SET NULL 
ON UPDATE SET NULL; 

但是你的表有:

CREATE TABLE `katalog` (
`Sprache` int(11) NOT NULL, 

將列Sprache設置爲NULL,因爲它被定義爲NOT NULL。

45

只需使用此查詢,我已經嘗試過了按我的情況和它運作良好

ALTER TABLE katalog ADD FOREIGN KEY (`Sprache`) REFERENCES Sprache(`ID`); 
0

嘗試所有在一個查詢

ALTER TABLE users ADD grade_id SMALLINT UNSIGNED NOT NULL DEFAULT 0, 
     ADD CONSTRAINT fk_grade_id FOREIGN KEY (grade_id) REFERENCES grades(id); 
9

簡單的步驟...

ALTER TABLE t_name1 ADD FOREIGN KEY (column_name) REFERENCES t_name2(column_name) 
1

MySQL將執行此查詢:

ALTER TABLE `db`.`table1` 
ADD COLUMN `col_table2_fk` INT UNSIGNED NULL, 
ADD INDEX `col_table2_fk_idx` (`col_table2_fk` ASC), 
ADD CONSTRAINT `col_table2_fk1` 
FOREIGN KEY (`col_table2_fk`) 
REFERENCES `db`.`table2` (`table2_id`) 
ON DELETE NO ACTION 
ON UPDATE NO ACTION; 

乾杯!