MySQL「エラー 1005 (HY000):テーブル 'foo.#sql-12c_4' を作成できません (errno:150)」
-
04-10-2019 - |
質問
データベースにいくつかのテーブルを作成していました 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」を書き、エラーを生成し、単に変更されました。ケーシング。