web-dev-qa-db-ja.com

MySQL「エラー1005(HY000):テーブル 'foo。#sql-12c_4'を作成できません(errno:150)」

私はデータベースfooにいくつかのテーブルを作成しようとしていましたが、そのたびに外部キーに関してerrno 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や他のオンラインで検索しました- このエラーを解決する方法についてのポインタを含む役立つブログ投稿を見つけました -しかし、何が間違っているのかわかりません。助けていただければ幸いです!

45
Ankur Banerjee

Car_idを車の主キーにする必要があります。

38
Paul Tomblin

注:私は同じ問題を抱えていました。これは、参照フィールドが2つの異なるテーブルの異なる照合順序にあったためです(まったく同じタイプでした)。

すべての参照フィールドが同じタイプと同じ照合順序を持っていることを確認してください!

31
NickT

両方のテーブルのエンジンが同じであることを確認してください。たとえば、次の場合:

CREATE Table FOO ();

そして:

CREATE Table BAR () ENGINE=INNODB;

テーブルBARからテーブルFOOに制約を作成しようとすると、特定のMySQLバージョンでは機能しません。

以下に従って問題を修正します。

CREATE Table FOO () ENGINE=INNODB;
14
Ville Rontti

微妙ですが、参照されている既存のテーブル「smallint unsigned」と一致するために、smallint列をunsignedとして宣言するのを忘れたため、このエラーが発生しました。署名されていないものと署名されていないものがあると、MySQLは新しいキーが外部テーブルに作成されないようにしました。

id smallint(3) not null

外部キーのために一致しません、

id smallint(3) unsigned not null
11
Eric L.

私がしようとしたときに、このまったく価値のない有益なエラーが発生しました:

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の競合にありました。

8
Mars Redwyne

また、両方のテーブルに同じ文字セットが必要です。

例えば.

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が同じエラーを返す別の微妙な障害です。

5
user2315570

私はUbuntu Linuxを使用していますが、私の場合、エラーは不正なステートメント構文が原因でした(ターミナルでperror 150と入力するとわかりました

MySQLエラーコード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);

それを修正しました。

3
Jeshurun

また、データベース全体(〜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を実行しています。

2
h-bomb

参照されるフィールドは、参照されるテーブルの「キー」である必要があり、必ずしも主キーである必要はありません。そのため、「car_id」は主キーであるか、「Cars」テーブルでNOT NULLおよびUNIQUE制約を使用して定義する必要があります。

さらに、両方のフィールドは同じタイプと照合順序である必要があります。

2
AKSinha

あなたが参照しているフィールドが外部キーと完全に一致することを確認してください、私の場合は一方が署名されておらず、もう一方が署名されているので、一致するように変更しました

ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 FOREIGN KEY(user_id)参照usersid)更新カスケード時のカスケード削除時

1
Ashahmali

解決済み:

Primary_KeyとForeign_Keyがデータ型と完全に一致することを確認してください。一方が署名されており、もう一方が署名されていない場合、失敗します。両方が符号なし整数であることを確認することをお勧めします。

1

すべて、私は問題を解決し、それを共有したかった:

私はこのエラーを抱えていました<>問題は私のステートメントにありました:

テーブルsystem_registro_de_modificacionの変更外部キーの追加(usuariomodificador_id)参照Usuario(id)削除制限時。

私は間違ってCASINGを書いていました:Windows WAMPで動作しますが、Linux MySQLではCASINGにより厳密なので、「usuario」(正確な大文字小文字)ではなく「Usuario」を書き、エラーを生成し、単に変更して修正しましたケーシング。

0
David L

重複する外部キー名を使用していました。

FK名を変更することで問題が解決しました。

明確化:

両方のテーブルにはPK1、FK1などと呼ばれる制約がありました。テーブルの名前を変更する/名前を一意にすることで問題が解決しました。

0
daVe

参照される列は、単一列のインデックス、または複数列インデックスの最初の列であり、同じタイプで同じ照合順序である必要があります。

私の2つのテーブルには異なる照合順序があります。 table_nameなどのshow table statusを発行することで表示でき、alter table table_name convert to character set utf8を発行することで照合順序を変更できます。

0
Rin-Kiet Riu