1

私は学生で、基本的な mysql を試しているところです。ただし、次のコードに関しては、同じエラーが発生し続けます。

エラー コード: 1005。テーブル 'mydatabase.orders' を作成できません (errno: 150)

CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL
);


CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);
4

4 に答える 4

1

エラー コード: 1005 -- コードに間違った主キー参照があります

通常、参照 FK フィールドが存在しないことが原因です。タイプミスがあるか、ケースを確認して同じであるか、フィールドタイプの不一致がある可能性があります。FK リンク フィールドは、定義と正確に一致する必要があります。

最初のステップ:

サーバーの管理者権限を持っている場合は、エラーを受け取った直後に MySQL コマンド「SHOW INNODB STATUS」(または MySQL 5.5「SHOW ENGINE INNODB STATUS」) を実行して開始することをお勧めします。このコマンドは、ログ情報とエラーの詳細を表示します。

スクリプトが 1 つのサーバーで正常に実行されても、別のサーバーで実行しようとするとエラーが発生する場合は、#6 が問題である可能性が高くなります。MySQL のバージョンが異なれば、デフォルトの文字セット設定も異なります。また、知らず知らずのうちに、サーバーごとに異なる文字セットを割り当てている可能性があります。

いくつかの既知の原因は次のとおりです。

  1. 2 つのキー フィールドのタイプまたはサイズが正確に一致しません。たとえば、1 つが INT(10) の場合、キー フィールドも INT(11) や TINYINT ではなく INT(10) である必要があります。クエリ ブラウザは INT(10) と INT(11) の両方に対して INTEGER のみを視覚的に表示する場合があるため、SHOW CREATE TABLE を使用してフィールド サイズを確認することをお勧めします。また、一方が SIGNED ではなく、もう一方が UNSIGNED であることも確認する必要があります。どちらもまったく同じである必要があります。
  2. 参照しようとしているキー フィールドの 1 つにインデックスがないか、主キーではありません。リレーションシップのフィールドの 1 つが主キーでない場合は、そのフィールドのインデックスを作成する必要があります。
  3. 外部キー名が既存のキーと重複しています。外部キーの名前がデータベース内で一意であることを確認してください。これをテストするには、キー名の末尾にいくつかのランダムな文字を追加するだけです.
  4. テーブルの 1 つまたは両方が MyISAM テーブルです。外部キーを使用するには、テーブルが両方とも InnoDB である必要があります。(実際には、両方のテーブルが MyISAM の場合、エラー メッセージは表示されません。キーが作成されないだけです。) Query Browser では、テーブル タイプを指定できます。
  5. カスケード ON DELETE SET NULL を指定しましたが、関連するキー フィールドが NOT NULL に設定されています。カスケードを変更するか、NULL 値を許可するようにフィールドを設定することで、これを修正できます。

  6. Charset オプションと Collat​​e オプションが、テーブル レベルとキー列の個々のフィールド レベルの両方で同じであることを確認してください。

  7. 外部キー列にデフォルト値 (つまり、デフォルト = 0) があります

  8. リレーションシップ内のフィールドの 1 つは、組み合わせ (複合) キーの一部であり、独自の個別のインデックスを持っていません。フィールドには複合キーの一部としてインデックスがありますが、制約で使用するには、そのキー フィールドだけに別のインデックスを作成する必要があります。

  9. ALTER ステートメントに構文エラーがあるか、リレーションシップのフィールド名の 1 つを間違って入力しました。

    10 外部キーの名前が最大長の 64 文字を超えています。

詳細については、次を参照してください: MySQL エラー番号 1005 テーブルを作成できません

于 2012-10-25T06:43:31.977 に答える
1

これ:

FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)

あなたが持っている場合にのみ機能します

  1. その Customer(P_ID) フィールドのインデックスなので、追加する必要があります
  2. innodb を使用 -> それがデフォルトのエンジンでない場合は、そのエンジンを具体的に追加する必要があります。

インデックスを追加すると、次のようになります。

    INDEX(P_ID)

私はあなたのためにそれを試すことができなかったので、ここでは「ドライ」コーディングですが、これで十分だと確信しています. ,明らかに配置などに注意してくださいが、これはうまくいくはずです。

于 2012-10-25T06:46:15.647 に答える
0

次のクエリを実行します。

CREATE TABLE Customer
(
P_ID int(3) UNSIGNED NOT NULL,
LastName varchar(10) NOT NULL,
FirstName varchar(10) NOT NULL,
Address varchar(20) NOT NULL,
City varchar(10) NOT NULL,
PRIMARY KEY (P_ID)
);


CREATE TABLE Orders
(
O_ID int(3) UNSIGNED NOT NULL,
OrderNo int NOT NULL,
P_ID int(3) UNSIGNED NOT NULL,
PRIMARY KEY (O_ID),
FOREIGN KEY(P_ID)REFERENCES Customer(P_ID)
);

P_ID を外部キーとして宣言する前に、主キーとして宣言する必要があります。

于 2012-10-25T06:48:25.040 に答える
0

これは機能するはずPRIMARY KEYです。顧客テーブルにはありませんでした。

EDITは句を削除しましたON DELETE CASCADE ON UPDATE CASCADE。おそらく不要です

CREATE TABLE Customer(
    P_ID int(3) UNSIGNED NOT NULL,
    LastName varchar(10) NOT NULL,
    FirstName varchar(10) NOT NULL,
    Address varchar(20) NOT NULL,
    City varchar(10) NOT NULL,
    PRIMARY KEY (`P_ID`)
);

CREATE TABLE Orders(
    O_ID int(3) UNSIGNED NOT NULL,
    OrderNo int(3) NOT NULL,
    P_ID int(3) UNSIGNED NOT NULL,
    PRIMARY KEY (O_ID),
    CONSTRAINT `P_ID` FOREIGN KEY(`P_ID`) REFERENCES `Customer` (`P_ID`)
);
于 2012-10-25T06:50:21.673 に答える