49

私はデータベースにいくつかのテーブルを作成する作業をしていましたfooが、外部キーに関してerrno150が発生するたびに発生します。まず、テーブルを作成するためのコードは次のとおりです。

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や他の場所をオンラインで検索しましたが、このエラーを解決する方法についてのポインタが記載された役立つブログ投稿を見つけましたが、何が問題になっているのかわかりません。どんな助けでもいただければ幸いです!

4

14 に答える 14

40

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

于 2010-05-09T20:18:16.113 に答える
31

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

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

于 2011-08-22T23:49:01.127 に答える
15

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

CREATE Table FOO ();

と:

CREATE Table BAR () ENGINE=INNODB;

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

次の方法で問題を修正します。

CREATE Table FOO () ENGINE=INNODB;
于 2012-09-27T06:54:13.680 に答える
11

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

id smallint(3) not null

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

id smallint(3) unsigned not null
于 2011-12-23T16:03:29.507 に答える
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

したがって...私の場合、問題はNOTNULLとONDELETESETNULLの間の競合にありました。

于 2012-07-02T14:55:29.790 に答える
5

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

例えば

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が同じエラーを返すもう1つの微妙な失敗です。

于 2013-04-24T12:46:16.590 に答える
3

私はUbuntulinuxを使用していますが、私の場合、エラーの原因はステートメントの構文が正しくないためです(ターミナルで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);

修正しました。

于 2011-09-01T05:17:21.497 に答える
2

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

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

于 2013-01-05T18:25:12.997 に答える
2

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

  • /private/etc/my.confを開きました
  • #MySQLサーバーmax_allowed_packetで、 1Mから4Mに変更されました(この値を試す必要がある場合があります)。
  • MySQLを再起動しました

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

Mac OS X(x86 64ビット)用のMySQL5.5.12を実行していることに注意してください。

于 2013-10-24T18:16:25.893 に答える
1

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

ALTER TABLE customer_information ADD CONSTRAINT fk_customer_information1 FOREIGN KEY(user_id)REFERENCES usersid)ON DELETE CASCADE ON UPDATE CASCADE

于 2015-02-24T07:13:44.963 に答える
1

解決済み:

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

于 2016-07-27T16:45:22.677 に答える
0

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

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

明確化:

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

于 2014-07-20T15:34:43.160 に答える
0

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

私の2つのテーブルの照合は異なります。これは、show table status likeを発行することで表示table_nameでき、照合は、alter table table_nameconvert to charactersetutf8を発行することで変更できます。

于 2016-01-26T05:35:32.663 に答える
-1

すべて、私は問題を解決し、それを共有したいと思いました:

このエラーが発生しました<>問題は私のステートメントにありました:

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

CASINGを間違って記述しました。WindowsWAMPで機能しますが、Linux MySQLではCASINGの方が厳密であるため、「usuario」(正確なケーシング)ではなく「Usuario」と記述するとエラーが発生し、単に変更するだけで修正されました。ケーシング。

于 2013-03-14T15:43:05.433 に答える