私はインターネットでこの問題の解決策を探し、Stack Overflowの質問を確認しましたが、私の場合は解決策がありませんでした。
テーブルsira_noからmetal_kodへの外部キーを作成したい。
ALTER TABLE sira_no
ADD CONSTRAINT METAL_KODU FOREIGN KEY(METAL_KODU)
REFERENCES metal_kod(METAL_KODU)
ON DELETE SET NULL
ON UPDATE SET NULL ;
このスクリプトは以下を返します。
Error Code: 1005. Can't create table 'ebs.#sql-f48_1a3' (errno: 150)
参照先のテーブルにインデックスを追加してみました:
CREATE INDEX METAL_KODU_INDEX ON metal_kod (METAL_KODU);
両方のテーブル(文字セットと照合)でMETAL_KODUをチェックしましたが、この問題の解決策が見つかりませんでした。この問題を修正するにはどうすればよいですか?
Metal_kodテーブルは次のとおりです。
METAL_KODU varchar(4) NO PRI
DURUM bit(1) NO
METAL_ISMI varchar(30) NO
AYAR_YOGUNLUK smallint(6) YES 100
エラーコード:1005-コードに間違った主キー参照があります
通常、参照されている外部キーフィールドが存在しないことが原因です。タイプミスがあったか、同じかどうかを確認するか、フィールドタイプが一致しない可能性があります。外部キーリンクフィールドは、定義と正確に一致する必要があります。
既知の原因には次のものがあります。
INT(10)
である場合、キーフィールドはINT(10)
またはTINYINT
ではなく、INT(11)
である必要があります。 Query BrowserはINT(10)
とINT(11)
の両方に対してSHOW
のみを視覚的に表示することがあるため、CREATE
TABLE
INTEGER
を使用してフィールドサイズを確認することができます。 。また、一方がSIGNED
ではなく、もう一方がUNSIGNED
であることも確認する必要があります。両方ともまったく同じである必要があります。MyISAM
テーブルです。外部キーを使用するには、両方のテーブルがInnoDB
である必要があります。 (実際には、両方のテーブルがMyISAM
である場合、エラーメッセージは表示されません-キーを作成しません。)クエリブラウザーで、テーブルタイプを指定できます。ON
DELETE
SET
NULL
を指定しましたが、関連するキーフィールドはNOT
NULL
に設定されています。これを修正するには、カスケードを変更するか、NULL
値を許可するようにフィールドを設定します。ALTER
ステートメントに構文エラーがあるか、リレーションシップのフィールド名の1つを誤って入力しました詳細については、次を参照してください:MySQLエラー番号1005テーブルを作成できません
これは、あるサーバーから別のサーバーにデータベースをエクスポートするときにも発生する可能性があり、デフォルトではテーブルはアルファベット順にリストされます。
したがって、最初のテーブルは、まだ作成されていない別のテーブルの外部キーを持つことができます。そのような場合は、foreign_key_checksを無効にしてデータベースを作成します。
スクリプトに次を追加するだけです。
SET FOREIGN_KEY_CHECKS=0;
そして、それは動作します。
マスターテーブルが削除されたことが原因の場合もありますが(foreign_key_checksを無効にすることにより)、外部キーCONSTRAINTが他のテーブルにまだ存在しています。 myの場合、テーブルを削除して再作成しようとしましたが、同じエラーがスローされていました。
そのため、すべてのテーブルからすべての外部キーCONSTRAINTを削除してから、テーブルを更新または作成してください。
非常に多くの場合、外部キーと参照キーが同じタイプまたは同じ長さでない場合に発生します。
同様のエラーが発生しました。問題は、子テーブルと親テーブルが同じ文字セットと照合順序を持たないことに関係していました。これは、ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;を追加することで修正できます。
CREATE TABLE IF NOT EXISTS `country` (`id` INT(11) NOT NULL AUTO_INCREMENT,...) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8;
... SQLステートメントにあるのは、欠落しているコードがあることを意味します。
エラーコード:1005
私は同様の問題を抱えていたので、ここで私が試したことがいくつかあります(解決策を除いて、順不同です:))
最後に、2つのエディターを開いていることがわかりました。1つはPhpStorm(JetBrains)ともう1つのMySQLワークベンチにあります。PhpStorm/ MySQL Workbenchが何らかの編集ロックを作成するようです。
ロックが有効かどうかを確認するためにPhpStormを閉じました(逆の場合もありました)。これで問題が解決しました。
私の場合、制約宣言で参照されているテーブルの名前が正しくないために発生しました(テーブル名の大文字を忘れてしまいました)。
ALTER TABLE `Window` ADD CONSTRAINT `Windows_ibfk_1` FOREIGN KEY (`WallId`) REFERENCES `Wall` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
外部キーは、参照する主キーとまったく同じタイプである必要があります。この例では、タイプが「INT UNSIGNED NOT NULL」であるため、フォアキーも「INT UNSIGNED NOT NULL」にする必要があります
CREATE TABLE employees(
id_empl INT UNSIGNED NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id)
);
CREATE TABLE offices(
id_office INT UNSIGNED NOT NULL AUTO_INCREMENT,
id_empl INT UNSIGNED NOT NULL,
PRIMARY KEY(id),
CONSTRAINT `constraint1` FOREIGN KEY (`id_empl`) REFERENCES `employees` (`id_empl`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='my offices';
同じエラーメッセージが表示されました。最後に、コマンドのテーブル名のスペルを間違えたことがわかりました。
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES country (id);
versus
ALTER TABLE `users` ADD FOREIGN KEY (country_id) REFERENCES countries (id);
MySQLはなぜこのようなテーブルが存在しないとMySQLが判断できないのでしょうか...
私の場合、1つのテーブルがInnodBで、もう1つのテーブルがMyISAMの場合に発生しました。 MySQL Workbenchを使用して、1つのテーブルのエンジンを変更すると解決します。
MyISAMについて言及したばかりです。他のテーブルがMyISAMで作成されていると仮定して、ステートメントの最後にENGINE = MyISAM DEFAULT CHARSET = latin1 AUTO_INCREMENT = 2;を追加してみてください。
CREATE TABLE IF NOT EXISTS `tablename` (
`key` bigint(20) NOT NULL AUTO_INCREMENT,
FOREIGN KEY `key` (`key`) REFERENCES `othertable`(`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;