2010-05-09 141 views
43

我正在創建數據庫foo中的某些表,但每次我最終都會遇到errno 150關於外鍵。首先,這是我創建表的代碼:MySQL「錯誤1005(HY000):無法創建表'foo。#sql-12c_4'(錯誤:150)」

CREATE TABLE Clients 
(
client_id    CHAR(10) NOT NULL , 
client_name    CHAR(50) NOT NULL , 
provisional_license_num CHAR(50) NOT NULL , 
client_address   CHAR(50) NULL , 
client_city    CHAR(50) NULL , 
client_county   CHAR(50) NULL , 
client_zip    CHAR(10) NULL , 
client_phone    INT  NULL , 
client_email    CHAR(255) NULL , 
client_dob    DATETIME NULL , 
test_attempts   INT  NULL 
); 
CREATE TABLE Applications 
(
application_id CHAR(10) NOT NULL , 
office_id  INT  NOT NULL , 
client_id  CHAR(10) NOT NULL , 
instructor_id CHAR(10) NOT NULL , 
car_id   CHAR(10) NOT NULL , 
application_date DATETIME NULL 
); 
CREATE TABLE Instructors 
(
instructor_id  CHAR(10) NOT NULL , 
office_id   INT  NOT NULL , 
instructor_name CHAR(50) NOT NULL , 
instructor_address CHAR(50) NULL , 
instructor_city CHAR(50) NULL , 
instructor_county CHAR(50) NULL , 
instructor_zip  CHAR(10) NULL , 
instructor_phone INT  NULL , 
instructor_email CHAR(255) NULL , 
instructor_dob  DATETIME NULL , 
lessons_given  INT  NULL 
); 
CREATE TABLE Cars 
(
car_id    CHAR(10) NOT NULL , 
office_id   INT  NOT NULL , 
engine_serial_num CHAR(10) NULL , 
registration_num CHAR(10) NULL , 
car_make   CHAR(50) NULL , 
car_model   CHAR(50) NULL 
); 
CREATE TABLE Offices 
(
office_id  INT  NOT NULL , 
office_address CHAR(50) NULL , 
office_city  CHAR(50) NULL , 
office_County CHAR(50) NULL , 
office_zip  CHAR(10) NULL , 
office_phone INT  NULL , 
office_email CHAR(255) NULL 
); 
CREATE TABLE Lessons 
(
lesson_num  INT   NOT NULL , 
client_id  CHAR(10)  NOT NULL , 
date   DATETIME  NOT NULL , 
time   DATETIME  NOT NULL , 
milegage_used DECIMAL(5, 2) NULL , 
progress  CHAR(50)  NULL 
); 
CREATE TABLE DrivingTests 
(
test_num  INT  NOT NULL , 
client_id CHAR(10) NOT NULL , 
test_date DATETIME NOT NULL , 
seat_num  INT  NOT NULL , 
score  INT  NULL , 
test_notes CHAR(255) NULL 
); 

ALTER TABLE Clients ADD PRIMARY KEY (client_id); 
ALTER TABLE Applications ADD PRIMARY KEY (application_id); 
ALTER TABLE Instructors ADD PRIMARY KEY (instructor_id); 
ALTER TABLE Offices ADD PRIMARY KEY (office_id); 
ALTER TABLE Lessons ADD PRIMARY KEY (lesson_num); 
ALTER TABLE DrivingTests ADD PRIMARY KEY (test_num); 
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id); 
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id); 
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Instructors FOREIGN KEY (instructor_id) REFERENCES Instructors (instructor_id); 
ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY (car_id) REFERENCES Cars (car_id); 
ALTER TABLE Lessons ADD CONSTRAINT FK_Lessons_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id); 
ALTER TABLE Cars ADD CONSTRAINT FK_Cars_Offices FOREIGN KEY (office_id) REFERENCES Offices (office_id); 
ALTER TABLE Clients ADD CONSTRAINT FK_DrivingTests_Clients FOREIGN KEY (client_id) REFERENCES Clients (client_id); 

這是我得到的錯誤:

mysql> ALTER TABLE Applications ADD CONSTRAINT FK_Applications_Cars FOREIGN KEY 
(car_id) REFERENCES Cars (car_id); 
ERROR 1005 (HY000): Can't create table 'foo.#sql-12c_4' (errno: 150) 

我跑SHOW ENGINE INNODB STATUS這給出了更詳細的錯誤描述:

------------------------ 
LATEST FOREIGN KEY ERROR 
------------------------ 
100509 20:59:49 Error in foreign key constraint of table foo/#sql-12c_4: 
FOREIGN KEY (car_id) REFERENCES Cars (car_id): 
Cannot find an index in the referenced table where the 
referenced columns appear as the first columns, or column types 
in the table and the referenced table do not match for constraint. 
Note that the internal storage type of ENUM and SET changed in 
tables created with >= InnoDB-4.1.12, and such columns in old tables 
cannot be referenced by such columns in new tables. 
See http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html 
for correct foreign key definition. 
------------ 

我搜索周圍StackOverflow和其他在線 - came across a helpful blog post here with pointers on how to resolve this error - 但我不明白什麼是錯的。任何幫助,將不勝感激!

+0

另請參閱http://verysimple.com/2006/10/22/mysql-error-number-1005-cant-create-table-mydbsql-328_45frm-errno-150/ – 2013-06-21 16:22:00

回答

34

您應該使car_id成爲汽車的主鑰匙。

+0

謝謝!不敢相信這是一個愚蠢的錯誤。 – 2010-05-09 20:22:32

+0

順便說一句,如果你正在改變應用程序表(其中有行)插入car_id作爲一個新的外鍵,Applications.car_id應該是空的,否則你會得到類似的錯誤。這就是我發生的事情。 – cawecoy 2014-07-15 22:30:45

+0

在我的情況下,由於參考表中已經有一個主鍵,所以使參考鍵具有唯一性就足夠了。 – 2016-07-29 16:48:03

30

注:我有同樣的問題,這是因爲引用的字段在2個不同的表(他們有完全相同的類型)不同的排序規則。

確保所有引用的字段具有相同的類型和相同的排序規則!

+2

+1有關整理的信息。你知道爲什麼排序規則會影響創建索引,即使數據類型相同。 – user325643 2011-08-27 06:30:33

+0

我認爲這是有道理的,因爲當我們使用不同的排序規則時,底層數據是不同的,並且部分mysql檢查外鍵是爲了確保數據完全相同......但我不知道官方原因;) – NickT 2011-09-07 07:50:17

+0

如果您的下一個問題是如何更改現有表的排序規則:http://stackoverflow.com/questions/742205/mysql-alter-table-collat​​ion#5468980 – penfold 2012-11-01 08:09:50

3

我使用Ubuntu Linux操作系統,在我的情況下,錯誤是由不正確的語句語法(我發現通過在終端,這給

MySQL錯誤代碼150輸入PERROR 150引起的:外鍵約束被不正確地形成

alter table scale add constraint foreign key (year_id) references year.id; 

改變查詢的語法來

alter table scale add constraint foreign key (year_id) references year(id); 

固定它。

8

微妙,但是這個錯誤讓我感到厭煩,因爲我忘記聲明一個smallint列作爲unsigned來匹配被引用的現有表「smallint unsigned」。有一個unsigned而另一個沒有unsigned導致MySQL阻止在新表上創建外鍵。

id smallint(3) not null 

不匹配,外鍵的緣故,

id smallint(3) unsigned not null 
+0

這節省了我很多時間! – 2014-07-02 17:11:11

+0

謝謝你。 – Klav 2016-02-17 15:16:50

8

我得到這個完全沒有價值和不提供信息的錯誤,當我嘗試:

ALTER TABLE `comments` ADD CONSTRAINT FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE SET NULL ON UPDATE CASCADE; 

我的問題是在我評論表中,user_id被定義爲:

`user_id` int(10) unsigned NOT NULL 

所以...在我的情況下,問題是與NOT NULL和ON DELETE SET NULL之間的衝突。

13

檢查兩個表具有相同的ENGINE。例如,如果您有:

CREATE Table FOO(); 

和:

CREATE Table BAR() ENGINE=INNODB; 

如果您嘗試創建從表BAR表FOO約束,也不會在特定的MySQL版本。

按照解決問題:

CREATE Table FOO() ENGINE=INNODB; 
2

引用的字段必須是一個「關鍵」在引用表,不一定是主鍵。所以「car_id」應該是主鍵,或者在「Cars」表中用NOT NULL和UNIQUE約束來定義。

此外,這兩個字段必須是相同的類型和排序規則。

0

一切,我解決的問題,並希望分享:

我有這個錯誤<> 的問題是,在我的發言:

ALTER TABLE system_registro_de_modificacion添加外鍵 ( usuariomodificador_id)參考文獻Usuario(id)On delete restrict;

我曾錯誤地寫套管:它工作在Windows WAMP,但在Linux中的MySQL更嚴格的外殼,所以書面方式,而不是「usuario」(確切的外殼)「Usuario」,所產生的誤差,只是改變了套管而已被糾正。

+1

我不認爲答案與問題相關,問題中的外殼是無可挑剔的,如果問題出在這裏,mysql應該給出不同的錯誤信息。 – 2014-02-04 20:21:04

3

此外,兩個表都需要具有相同的字符集。

例如,

CREATE TABLE1 (
    FIELD1 VARCHAR(100) NOT NULL PRIMARY KEY, 
    FIELD2 VARCHAR(100) NOT NULL 
)ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_bin; 

CREATE TABLE2 (
    Field3 varchar(64) NOT NULL PRIMARY KEY, 
    Field4 varchar(64) NOT NULL, 
    CONSTRAINT FORIGEN KEY (Field3) REFERENCES TABLE1(FIELD1) 
) ENGINE=InnoDB; 

將失敗,因爲他們有不同的字符集。這是另一個微妙的失敗,其中mysql返回相同的錯誤。

2

當試圖導入整個數據庫(〜800 MB)時,我還收到了此錯誤(對於多個表)以及約束錯誤和MySQL連接和斷開連接。我的問題是的結果MySQL服務器允許的最大數據包太低。要解決這個(在Mac):

  • 開業/private/etc/my.conf
  • #MySQL服務器,改變max_allowed_packet從1M到4M(您可能需要使用該值試驗。)
  • 重啓動MySQL的

後成功導入數據庫。

注意我正在爲Mac OS X(x86 64位)運行MySQL 5.5.12。

0

我正在使用重複的外鍵名稱。

重命名FK名稱解決了我的問題。

澄清:

兩個表有一個名爲PK1,FK1約束,等他們重命名/製作獨特的解決了這個問題的名稱。

1

檢查,以你引用到外地與外鍵的精確匹配,在我的情況下,一個是無符號和其他的簽署,所以我只是改變了他們匹配和這個工作

ALTER TABLE customer_information 添加約束fk_customer_information1 外鍵(user_id) 參考usersid) ON DELETE CASCADE ON UPDATE CASCADE

0

的參考列必須是單個列的索引或第一式柱多列索引中的n,以及相同的類型和相同的排序規則。

我的兩個表格有不同的排序規則。可以通過發佈顯示錶狀態(如table_name)來顯示,並且可以通過發佈改變表table_name將其轉換爲字符集utf8來更改排序規則。

1

解決:

檢查以確保Primary_Key和Foreign_Key與數據類型精確匹配。 如果一個簽名另一個無符號,它將失敗。 好的做法是確保兩者都是無符號整數。

相關問題