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

StackOverflow https://stackoverflow.com/questions/2799021

質問

データベースにいくつかのテーブルを作成していました foo, 、しかし毎回、外部キーに関してエラー番号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 やオンラインの他の場所で検索しました - このエラーを解決する方法についてのヒントが記載された役立つブログ投稿をここで見つけました - しかし、何が問題なのかわかりません。助けていただければ幸いです。

役に立ちましたか?

解決

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

他のヒント

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

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

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

CREATE Table FOO ();

と:

CREATE Table BAR () ENGINE=INNODB;

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

次のことにより、問題を修正します。

CREATE Table FOO () ENGINE=INNODB;

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

id smallint(3) not null

外国の鍵のために、一致しません、

id smallint(3) unsigned not null

以下を試みたときに、これを完全に無価値で情報のないエラーを得ました。

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と削除nullの間の競合にありました。

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

例えば

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

私は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);

修正しました。

参照されたフィールドは、参照されたテーブルの「キー」でなければなりません。必ずしも主キーではありません。したがって、「car_id」は主要なキーであるか、「cars」テーブルの無効で一意の制約で定義する必要があります。

さらに、両方のフィールドは同じタイプと照合でなければなりません。

また、データベース全体(〜800 MB)をインポートしようとするときに、制約エラーとMySQLの接続と切断のMySQLとともに、このエラー(いくつかのテーブル用)を受け取りました。私の問題は結果でした MySQLサーバー MAXはパケットが低すぎることを許可しました。これを解決するには(Macで):

  • Opened /private/etc/my.conf
  • #MySQLサーバー, 、 かわった max_allowed_packet 1mから4mまで(この値を試す必要があるかもしれません。)
  • mysqlを再起動しました

その後、データベースは正常にインポートされました。

メモMAC OS X(X86 64ビット)でMySQL 5.5.12を実行しています。

参照しているフィールドを確認するには、外部キーとの正確な一致であり、私の場合は1つが署名されておらず、もう1つが署名されたので、私はそれらを一致させましたが、これはうまくいきました

Table Customer_informationを変更する制約fk_customer_information1外部キー(user_id)参照 users(id)カスケードの更新時にカスケードを削除します

解決:

Primary_keyとForeign_keyがデータ型と正確に一致することを確認するために確認してください。 1つが署名されていない場合、署名されていない別のものが失敗します。グッドプラクティスは、両方が署名されていないINTであることを確認することです。

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

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

説明:

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

参照された列は、単一の列のインデックスまたはマルチ列インデックスの最初の列、および同じタイプと同じ照合でなければなりません。

私の2つのテーブルには異なるコレクションがあります。ショーテーブルステータスを次のように発行することで表示できます table_name また、照合を変更することで照合を変更できます table_name 文字セットUTF8に変換します。

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

このエラーがありました<>問題は私の声明の中にありました:

Table System_registro_de_modificacion add add efigriceキー(usuariomodificador_id)参照usuario(id)delete restrict;

ケーシングを誤って書いていました。WindowsWampで動作しますが、Linux MySQLではケーシングがより厳格であるため、「Usuario」(正確なケース)の代わりに「Usuario」を書き、エラーを生成し、単に変更されました。ケーシング。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top