13

MySQL ワークベンチを使用してテーブルに外部キーを追加しましたが、奇妙なエラーが発生しました。これは SQL ステートメントです。

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL  AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId`
        FOREIGN KEY (`goodsId` )
        REFERENCES `tansung`.`Goods` (`goodsId` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    , ADD INDEX `goodsId` (`goodsId` ASC) ;

適用をクリックすると、サプライズが出てきます!

ERROR 1005: Can't create table 'tansung.#sql-1b10_1' (errno: 150)

SQL Statement:

ALTER TABLE `tansung`.`Declaration` ADD COLUMN `goodsId` INT(11) NOT NULL  AFTER `declarationId` , 
    ADD CONSTRAINT `goodsId`
        FOREIGN KEY (`goodsId` )
        REFERENCES `tansung`.`Goods` (`goodsId` )
        ON DELETE NO ACTION
        ON UPDATE NO ACTION
    , ADD INDEX `goodsId` (`goodsId` ASC)


ERROR: Error when running failback script. Details follow.


ERROR 1050: Table 'Declaration' already exists

SQL Statement:

CREATE TABLE `Declaration` (
    `declarationId` int(11) NOT NULL,
    PRIMARY KEY (`declarationId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

ロジックの間違いが見つからない、エラーの意味が分からない、どなたか助けてください。

4

10 に答える 10

16

データベース全体のすべての外部キー名は一意である必要があります。「goodsId」という名前の外部キーが既にある場合は、別のテーブルであっても、このエラーが発生します。

関連する列の型 (INT など) と制約 (UNIQUE など) がまったく同じでない場合、そのエラーが発生します。

于 2012-03-20T20:14:59.983 に答える
10

多くの理由で発生する可能性があります。以下は、一般的な理由の一部です。これらの種類のエラーがスローされるため、構文エラーとも言えます。

  1. FK (外部キー) テーブル エンジンが MyISAM を使用し、PK (主キー) テーブル エンジンが InnoDB を使用している場合。MyISAM は外部キー制約をサポートしていません。そのため、リンク テーブルを InnoDB に変換することをお勧めします。

  2. データベース全体のすべての外部キー名は一意である必要があります。別のテーブルであっても、同じ名前の外部キー制約が既にある場合は、このエラーが発生します。

  3. 関連する列のデータ型 (INT など) と制約 (UNIQUE など) がまったく同じでない場合、そのエラーが発生します。

于 2013-05-22T03:23:34.873 に答える
5

リンク先のテーブル (あなたの場合は Goods) が MyISAM を使用して保存され、インデックスを追加しているテーブル (あなたの場合は Declarations) が InnoDB を使用して保存されている場合に、このエラーが発生します

これは、データベース ディレクトリ内のファイルからわかります。MyISAM テーブルには次のようなファイルがあります。

table_name.frm
table_name.MYD
table_name.MYI

InnoDB テーブルには次のものが含まれます。

table_name.frm

MyISAM は外部キー制約をサポートしていません。Goods テーブルを InnoDB に変換することをお勧めします (ただし、最初にドキュメントを見て、基本的な調査を行ってください)。

ALTER TABLE Goods ENGINE=INNODB;

この変更を行った後、私の ADD INDEX 操作は正常に完了しました。

于 2011-09-28T10:58:03.337 に答える
1

phpMyAdmin でこれを実行しようとすると、名前にハイフンが含まれるテーブルでは FK が 1 つしか許可されず、エラーが発生することがわかりました。理由はわかりませんが、回避するのは簡単でした。

 CREATE TABLE `something_new` LIKE `something-old`;
 DROP TABLE `something-old`;

YMMV。

于 2015-05-09T15:17:56.647 に答える
1

他の人が言ったように、最初に2つの列の型が同じで、データベースがそれをサポートしていることを確認してください. その後、他のテーブルへのキーを保持する列が有効であることを確認します。データが含まれる既存の列に制約を追加していて、そのデータが他のテーブルの主キーのいずれとも一致しなかったため、関係を作成しようとすると失敗するという問題がありました。それを修正するには、すべての列を更新して、作成しようとしていた制約と列データが一致するようにしました。

于 2013-01-16T15:54:11.430 に答える
0

4番目に考えられる問題(abhijitcapsによって提案された3つに対する)は、参照している列を主キーにしなかったことです。

于 2014-08-01T09:21:38.463 に答える
0

そのエラーが発生したのは、既にデータが含まれているテーブルを更新しようとしていて、データがFK restrictions.

于 2012-05-20T09:43:02.357 に答える
0

私も同じ問題を抱えていました。親テーブルには存在しないデータが子テーブルにあったようです。外部結合を実行して違いを確認し、一致しない行に有効な ID を割り当てたり、それらを削除したりできます。

DELETE FROM books
WHERE NOT EXISTS (
    SELECT * FROM users
    WHERE books.user_id = users.id
)
于 2012-04-21T12:50:22.573 に答える
0

Errno 150 には多くの原因があります。SUPER 権限をお持ちの場合は、使用してみてください

エンジンの INNODB ステータスを表示

そしてそれは原因が何であったかを教えてくれます。SUPER 権限を持っていない場合は、考えられる原因をすべて調べる必要があります。SHOW INNODB STATUS の使用方法とすべての原因のリストは、次の場所にあります。

MySQL 外部キー エラーと Errno 150

于 2012-06-15T18:01:24.717 に答える
0

との型定義は同一Goods.goodsIdDeclarations.goodsIdなければなりませんerrno: 150

それらが両方とも同じデータ型であることを確認してください。これgoodsId INT(11) NOT NULLDeclarationsテーブルにあるようです。CREATE TABLEステートメントは何のためGoodsですか?

于 2011-04-22T17:40:56.550 に答える