web-dev-qa-db-ja.com

既存のテーブルに外部キーを追加すると、エラー1050テーブルがすでに存在します

次の列を持つテーブル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を選択できません。

この外部キーを追加できない理由がよくわかりません。追加したテーブル間に外部キーを正常に作成しました。登録テーブルはしばらくの間存在していました...

21
avaleske

そこで、チームメンバーがこれを理解しました。 1つのテーブルはタイプutf8_generalで設定され、別のテーブルはタイプdefaultに設定されました。デフォルトはutf8_generalであるため、これが問題になるとは思いませんでしたが、明らかにmysqlは基になる型ではなく型名のみを調べます。

2
avaleske

同じエラーが発生しましたが、これは外部キーがすでに存在していたことが原因でした。必要なのは、制約を追加することだけです。

ALTER TABLE Registration 
  ADD CONSTRAINT idx_Registration_CustomizationSet 
  FOREIGN KEY (customization_set_guid) 
  REFERENCES CustomizationSet(customization_set_guid);
10
pjvr

ここにあるMySQLにこれに関するバグレポートがあるようです:

MySQLバグ55296

結局、彼らはサーバーをアップグレードし、問題を修正したと思います。それを読んで、私はしかしわかりません。制約名の入力/変更などの回避策がいくつかありました。これが同じだと思われる場合は、バグを再度開いてください。

ある時点で、タイプが一致せず、ワークベンチが間違ったエラーで応答していたと彼らは述べています(errno150またはerrno121であるはずです)。これらのエラーの原因はここで確認できます: MySQL外部キーエラーおよびErrno 15

2
juacala

私は同じエラーを受け取りました、そして私のケースはまだ言及されていなかったので、私はこの答えを投稿します、そしてうまくいけばそれは誰かの時間を節約するかもしれません!

私の2つのテーブルエンジン。 1つはInnoDBで、もう1つはMyIsamでした。

テーブルのエンジンを変更するには:

テーブルを選択し、テーブルの変更を押してから、ワークベンチの右端にある二重矢印を押します(上向きになります)。

エンジンを交換してください!

1
Paschalis
  • CustomizationSetテーブルのストレージエンジンタイプを確認してください。

同じ問題がありましたが、外部キー制約をサポートしていないタイプがいくつかあるため、エンジンタイプをInnoDBに変更することで解決できました。

1
Santosh

私も同様の問題を抱えていましたが、最終的には整合性制約の問題でした。外部キー列は、存在しない外部列を参照していました。

以下を実行して、これが当てはまるかどうかをテストしてみてください:

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);
0
Nischal Bachu

MysqlWorkbenchを使用すると、エラーは誤解を招く可能性があります。私の問題は、すでに行があり、行の1つが空であるテーブルに外部キー制約を追加しようとしたことでした(FK制約を満たしていませんでした。適用すると制約が失敗するという文句を言う代わりに、MysqlWorkbenchはテーブルが存在することを報告しました。

問題のある行を削除して修正(またはフィールドに許容値を追加して制約する)すると、問題が解決しました。

0
Kahitarich

タイプミスかどうかはわかりませんが、そうすべきではありません

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);
0
ace

すでに存在するテーブルについてはわかりませんが、必要な列を選択できない理由は、列が同じタイプではないことが原因である可能性があります。それらが両方とも同じタイプ、同じ長さであり、すべて同じオプションがあることを確認してください。

0
invertedSpear