2016-04-26 18 views
0

なぜ特定の外部キーをここに追加できないのか分かりません。これらのテーブルは、MySQL Workbenchを介して生成され、MySQLのドキュメントと他の類似の問題や解決策を検索すると、と思っていますが、特に私は1つの外部キーを追加できません:MySQL - ここで外部キーを追加できないのはなぜですか?

inspection_statusesinspection_idinspection_responsesを参照する必要があります。 tpa_result

私は見逃していますか?

これは私が新しい外部キーを追加するために使用しようとしている文です:

ALTER TABLE `vipsouth_app`.`inspection_statuses` 
ADD CONSTRAINT `inspection_statuses_ibfk_3` 
    FOREIGN KEY (`inspection_id`) 
    REFERENCES `vipsouth_app`.`inspection_responses` (`tpa_result`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION; 

をそして、それは、このエラーを生成します。

操作に失敗しました:SQLスクリプトを適用中にエラーが発生しましたデータベースに転送します。 エラー1005:テーブルvipsouth_appを作成できません。 #sql-1f48_7(エラー番号:150 "外部キー制約が間違って形成されている")

CREATE TABLE `inspection_responses` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `inspection_request_id` int(10) unsigned NOT NULL, 
    `tpa_result` varchar(10) CHARACTER SET utf8 NOT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `created_by` int(10) unsigned NOT NULL DEFAULT '0', 
    `updated_at` timestamp NULL DEFAULT NULL, 
    `updated_by` int(10) unsigned DEFAULT NULL, 
    `deleted_at` timestamp NULL DEFAULT NULL, 
    `deleted_by` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `tpa_result_UNIQUE` (`tpa_result`), 
    KEY `inspection_responses_ibfk_1_idx` (`inspection_request_id`), 
    CONSTRAINT `inspection_responses_ibfk_1` FOREIGN KEY (`inspection_request_id`) REFERENCES `inspection_requests` (`id`) ON DELETE  CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

CREATE TABLE `inspection_statuses` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `inspection_request_id` int(10) unsigned NOT NULL, 
    `inspection_response_id` int(10) unsigned NOT NULL, 
    `tpa_code` varchar(4) COLLATE utf8_unicode_ci NOT NULL, 
    `user_id` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
    `password` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
    `inspection_id` varchar(10) COLLATE utf8_unicode_ci NOT NULL, 
    `status` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `note` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `url` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL, 
    `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `created_by` int(10) unsigned NOT NULL, 
    `updated_at` timestamp NULL DEFAULT NULL, 
    `updated_by` int(10) unsigned DEFAULT NULL, 
    `deleted_at` timestamp NULL DEFAULT NULL, 
    `deleted_by` int(10) unsigned DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    KEY `inspection_statuses_ibfk_1_idx` (`inspection_request_id`), 
    KEY `inspection_statuses_ibfk_2_idx` (`inspection_response_id`), 
    CONSTRAINT `inspection_statuses_ibfk_1` FOREIGN KEY (`inspection_request_id`) REFERENCES `inspection_requests` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    CONSTRAINT `inspection_statuses_ibfk_2` FOREIGN KEY (`inspection_response_id`) REFERENCES `inspection_responses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 
+0

返されるエラーメッセージはありますか? \t タイプが同じではない可能性があります。あなたは 'tpa_result'(' varchar(10)CHARACTER SET utf8 NOT NULL')で 'COLLATE'(' inspection_id varchar(10)COLLATE utf8_unicode_ci NOT NULL')をマップしようとしています – Delphine

+0

質問を更新しました。私が得ているエラーメッセージ。 – CJG

+0

'inspection_id'と' tpa_result'の両方に全く同じ型を入れようとしましたか? 'UNIQUE'制約が' tpa_result'で有効になっていることを確認してください – Delphine

答えて

0

The data types and constraints defined on both the columns should be exactly the same. Except for a foreign key can be NULLable.

これはあなたのためにそれを行う必要があります。私は何の誤りもなかった。

SET foreign_key_checks = 0; 

    CREATE TABLE `inspection_responses` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `inspection_request_id` int(10) unsigned NOT NULL, 
     `tpa_result` varchar(10) CHARACTER SET utf8 NOT NULL, 
     `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
     `created_by` int(10) unsigned NOT NULL DEFAULT '0', 
     `updated_at` timestamp NULL DEFAULT NULL, 
     `updated_by` int(10) unsigned DEFAULT NULL, 
     `deleted_at` timestamp NULL DEFAULT NULL, 
     `deleted_by` int(10) unsigned DEFAULT NULL, 
     PRIMARY KEY (`id`), 
     UNIQUE KEY `id_UNIQUE` (`id`), 
     UNIQUE KEY `tpa_result_UNIQUE` (`tpa_result`), 
     KEY `inspection_responses_ibfk_1_idx` (`inspection_request_id`), 
     CONSTRAINT `inspection_responses_ibfk_1` FOREIGN KEY (`inspection_request_id`) REFERENCES `inspection_requests` (`id`) ON DELETE  CASCADE ON UPDATE CASCADE 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

    CREATE TABLE `inspection_statuses` (
     `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
     `inspection_request_id` int(10) unsigned NOT NULL, 
     `inspection_response_id` int(10) unsigned NOT NULL, 
     `tpa_code` varchar(4) COLLATE utf8_unicode_ci NOT NULL, 
     `user_id` varchar(30) COLLATE utf8_unicode_ci NOT NULL, 
     `password` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
     `inspection_id` varchar(10) COLLATE utf8_unicode_ci NOT NULL, 
     `status` varchar(50) COLLATE utf8_unicode_ci DEFAULT NULL, 
     `note` varchar(1000) COLLATE utf8_unicode_ci DEFAULT NULL, 
     `url` varchar(1024) COLLATE utf8_unicode_ci DEFAULT NULL, 
     `created_at` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
     `created_by` int(10) unsigned NOT NULL, 
     `updated_at` timestamp NULL DEFAULT NULL, 
     `updated_by` int(10) unsigned DEFAULT NULL, 
     `deleted_at` timestamp NULL DEFAULT NULL, 
     `deleted_by` int(10) unsigned DEFAULT NULL, 
     PRIMARY KEY (`id`), 
     UNIQUE KEY `id_UNIQUE` (`id`), 
     KEY `inspection_statuses_ibfk_1_idx` (`inspection_request_id`), 
     KEY `inspection_statuses_ibfk_2_idx` (`inspection_response_id`), 
     CONSTRAINT `inspection_statuses_ibfk_1` FOREIGN KEY (`inspection_request_id`) REFERENCES `inspection_requests` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
     CONSTRAINT `inspection_statuses_ibfk_2` FOREIGN KEY (`inspection_response_id`) REFERENCES `inspection_responses` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

SET foreign_key_checks = 1; 
+0

外部キーチェックを無効にすると、まだエラーが表示されます: エラー1822:外部キーのコンストレインを追加できませんでした。参照テーブル 'inspection_responses'の制約 'inspection_statuses_ibfk_3'のインデックスがありません – CJG

+0

@CJG - これは私にとってはうまく機能しました。 – MontyPython

+0

2つの 'CREATE TABLE'文もエラーなしで実行できます。問題は別の外部キーを追加することです。エラーの原因となっている 'ALTER TABLE'文を含めるように質問を更新しました。申し訳ありませんが、最初に質問を投稿したときに私は十分に具体的ではありませんでした。 – CJG