240

私は2つのテーブルを持っています。これは、列を持つtable1親テーブルであり、FKを配置するとエラーが発生する列(実際の名前ではない)です。レコードが削除された場合、テーブル 2 のレコードを削除したいと思います。助けてくれてありがとうIDtable2IDFromTable1IDFromTable1IDtable1Foreign key constraint is incorrectly formed errortable1

ALTER TABLE `table2`  
   ADD CONSTRAINT `FK1` 
      FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`) 
      ON UPDATE CASCADE 
      ON DELETE CASCADE;

他の情報が必要な場合はお知らせください。私はmysqlを初めて使用します

4

36 に答える 36

557

HeidiSQL でも同じ問題に遭遇しました。あなたが受け取るエラーは非常に不可解です。私の問題は、外部キー列と参照列が同じタイプまたは長さではないということになりました。

外部キー列はSMALLINT(5) UNSIGNEDで、参照列は でしたINT(10) UNSIGNED。両方をまったく同じタイプにすると、外部キーの作成は完全に機能しました。

于 2012-06-19T01:15:32.980 に答える
68

親テーブルがMyISAMエンジンを使用して作成されたとき、私は同じ問題を抱えていました。それはばかげた間違いです。私はそれを修正しました:

ALTER TABLE parent_table ENGINE=InnoDB;
于 2015-12-14T18:37:46.793 に答える
40

列が同一 (同じタイプ) であることを確認し、参照列が でない場合はprimary_key、それが であることを確認しますINDEXED

于 2016-06-09T08:19:31.843 に答える
18

mysql エラー テキストはあまり役に立ちません。私の場合、列に " not null" 制約があったため、" on delete set null" は許可されませんでした。

于 2016-08-26T08:20:19.947 に答える
12

完成まであと少し。

このエラーは、VARCHAR(..) を含む外部キーがあり、参照されるテーブルの文字セットがそれを参照するテーブルと異なる場合にも発生する可能性があります。

たとえば、Latin1 テーブルの VARCHAR(50) は、UTF8 テーブルの VARCHAR(50) とは異なります。

于 2016-02-18T14:43:44.380 に答える
10

->unsigned();すべて問題なければ、 の最後に追加するだけですforegin key

うまくいかない場合は、両方のフィールドのデータ型を確認してください。それらは同じでなければなりません。

于 2016-06-01T10:37:51.723 に答える
4

他の回答は非常に役に立ちますが、私の経験も共有したかっただけです。

他のテーブル ( with dataid )で外部キーとして既に参照されているテーブルを削除し、追加の列を使用してテーブルを再作成/インポートしようとしたときに、問題に直面しました。

レクリエーションのクエリ (phpMyAdmin で生成) は次のようになります。

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL,            /* No PRIMARY KEY index */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

... /* SOME DATA DUMP OPERATION */

ALTER TABLE `the_table`
  ADD PRIMARY KEY (`id`), /* PRIMARY KEY INDEX */
  ADD UNIQUE KEY `uk_acu_donor_name` (`name`);

お気づきかもしれませんが、問題の原因となった作成 (およびデータの挿入PRIMARY KEY)後にインデックスが設定されました。

解決

解決策は、外部キーとして参照されていPRIMARY KEYたテーブル定義クエリにインデックスを追加し、インデックスが設定されていた部分からも削除することでした。idALTER TABLE

CREATE TABLE `the_table` (
  `id` int(11) NOT NULL PRIMARY KEY,            /* <<== PRIMARY KEY INDEX ON CREATION */  
  `name` varchar(255) NOT NULL,
  `name_fa` varchar(255) NOT NULL,
  `name_pa` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
于 2017-08-23T13:04:13.487 に答える
3

次のコマンドを実行してみてください。

show create table Parent

//そして、myISAMやinnoDBなど、両方のテーブルのタイプが同じかどうかを確認します
//このエラーメッセージで確認するその他の側面:外部として使用される列
キーにはインデックスを付ける必要があり、同じタイプである必要があります
(つまり、一方がsmallint(5)型で、もう一方がsmallint(6)型の場合、
動作しません)、整数の場合は符号なしにする必要があります。

//または文字セットを確認します
「character_set_database」のような変数を表示します。
「collat​​ion_database」のような変数を表示します。

//編集:このようなものを試してください
ALTER TABLE table2
制約を追加fk_IdTable2
外部キー(Table1_Id)
参考資料Table1(Table1_Id)
更新カスケードについて
カスケードの削除時;
于 2011-12-08T16:58:43.747 に答える
2

私も同じ問題を抱えていました。

問題は、参照列が主キーではないことです。

それを主キーにすると、問題は解決します。

于 2016-10-18T11:01:55.043 に答える
1

Alter table を使用して 2 つのテーブル間に外部キーを追加する際に問題がありましたが、外部キー関係を追加しようとしている各列にインデックスが作成されていることを確認することが役に立ちました。PHP myAdmin でこれを行うには: テーブルに移動し、構造タブをクリックします。スクリーンショットに示すように、インデックス オプションをクリックして、目的の列にインデックスを付けます。

ここに画像の説明を入力

外部キーで参照しようとしていた両方の列にインデックスを作成すると、alter table を正常に使用して外部キー関係を作成することができました。以下のスクリーンショットのように、列にインデックスが付けられていることがわかります。

ここに画像の説明を入力

zip_code が両方のテーブルにどのように表示されるかに注目してください。

于 2017-01-12T22:40:49.197 に答える
1

Symfony 2.8 でも同じ問題がありました。

外部キーの int の長さなどに同様の問題がなかったため、最初はわかりませんでした。

最後に、プロジェクト フォルダーで次の操作を行う必要がありました。(サーバーの再起動は役に立ちませんでした!)

app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result

于 2016-05-24T14:07:56.517 に答える
1

私はちょうど今同じ問題に遭遇しました。私の場合、外部キーで参照しているテーブルが現在のテーブルの前に (コードの前に) 作成されていることを確認するだけで済みました。したがって、変数 (x*5) を参照している場合、システムは x が何であるかを認識している必要があります (x はコードの前の行で宣言する必要があります)。これで私の問題は解決しました。他の人に役立つことを願っています。

于 2019-07-15T00:39:06.803 に答える