次の列を持つテーブルCustomizationSetがあります。
customization_set_guid (which is a non-nullable guid and also the primary key)
creator_account_guid
and a few others
そして、既存のデータを含むテーブル列への登録:
registration_id (an int and the primary key)
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null)
and a few other columns
私が実行しようとすると
ALTER TABLE Registration ADD FOREIGN KEY
(
customization_set_guid
) REFERENCES CustomizationSet (
customization_set_guid
);
mySQL Workbenchでは、エラー1050Table '。\ dbname\registration'が既に存在します。
[テーブルの変更]ダイアログの[外部キー]タブでUIを使用して外部キーを追加しようとし、参照テーブルとしてCustomizationSetを選択すると、列のリストでcustomization_set_guidを選択できません。
この外部キーを追加できない理由がよくわかりません。追加したテーブル間に外部キーを正常に作成しました。登録テーブルはしばらくの間存在していました...
そこで、チームメンバーがこれを理解しました。 1つのテーブルはタイプutf8_generalで設定され、別のテーブルはタイプdefaultに設定されました。デフォルトはutf8_generalであるため、これが問題になるとは思いませんでしたが、明らかにmysqlは基になる型ではなく型名のみを調べます。
同じエラーが発生しましたが、これは外部キーがすでに存在していたことが原因でした。必要なのは、制約を追加することだけです。
ALTER TABLE Registration
ADD CONSTRAINT idx_Registration_CustomizationSet
FOREIGN KEY (customization_set_guid)
REFERENCES CustomizationSet(customization_set_guid);
ここにあるMySQLにこれに関するバグレポートがあるようです:
結局、彼らはサーバーをアップグレードし、問題を修正したと思います。それを読んで、私はしかしわかりません。制約名の入力/変更などの回避策がいくつかありました。これが同じだと思われる場合は、バグを再度開いてください。
ある時点で、タイプが一致せず、ワークベンチが間違ったエラーで応答していたと彼らは述べています(errno150またはerrno121であるはずです)。これらのエラーの原因はここで確認できます: MySQL外部キーエラーおよびErrno 15
私は同じエラーを受け取りました、そして私のケースはまだ言及されていなかったので、私はこの答えを投稿します、そしてうまくいけばそれは誰かの時間を節約するかもしれません!
私の2つのテーブルエンジン。 1つはInnoDBで、もう1つはMyIsamでした。
テーブルのエンジンを変更するには:
テーブルを選択し、テーブルの変更を押してから、ワークベンチの右端にある二重矢印を押します(上向きになります)。
エンジンを交換してください!
- CustomizationSetテーブルのストレージエンジンタイプを確認してください。
同じ問題がありましたが、外部キー制約をサポートしていないタイプがいくつかあるため、エンジンタイプをInnoDBに変更することで解決できました。
私も同様の問題を抱えていましたが、最終的には整合性制約の問題でした。外部キー列は、存在しない外部列を参照していました。
以下を実行して、これが当てはまるかどうかをテストしてみてください:
select r.customization_set_guid, c.customization_set_guid
from Registration r
right join CustomizationSet c
on
r.customization_set_guid = c.customization_set_guid
where isnull(c.customization_set_guid);
MysqlWorkbenchを使用すると、エラーは誤解を招く可能性があります。私の問題は、すでに行があり、行の1つが空であるテーブルに外部キー制約を追加しようとしたことでした(FK制約を満たしていませんでした。適用すると制約が失敗するという文句を言う代わりに、MysqlWorkbenchはテーブルが存在することを報告しました。
問題のある行を削除して修正(またはフィールドに許容値を追加して制約する)すると、問題が解決しました。
タイプミスかどうかはわかりませんが、そうすべきではありません
ALTER TABLE Registration ADD FOREIGN KEY
(
customization_set_guid
) REFERENCES CustomizationSet (
customization_set_guid
);
次のようなものになります
ALTER TABLE Registration ADD FOREIGN KEY
customization_set_guid_fk (customization_set_guid)
REFERENCES CustomizationSet (customization_set_guid);
すでに存在するテーブルについてはわかりませんが、必要な列を選択できない理由は、列が同じタイプではないことが原因である可能性があります。それらが両方とも同じタイプ、同じ長さであり、すべて同じオプションがあることを確認してください。