2016-04-26 11 views
0

Ich bin mir nicht sicher, warum ich hier keinen bestimmten Fremdschlüssel hinzufügen kann. Diese Tabellen wurden über MySQL Workbench generiert, und basierend auf der MySQL-Dokumentation und auf der Suche nach anderen ähnlichen Problemen/Lösungen, I Think ist alles in Ordnung ... noch kann ich nicht einen Fremdschlüssel insbesondere hinzufügen:MySQL - Warum kann ich hier keinen Fremdschlüssel hinzufügen?

inspection_statuses. muss Referenz inspection_responses sein. tpa_result

Was vermisse ich/übersehen?

Dies ist die Aussage, die ich den neuen Fremdschlüssel zu verwenden, ich versuche, hinzuzufügen:

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; 

Und das erzeugt diesen Fehler:

Operation fehlgeschlagen: Es gibt einen Fehler, während die SQL-Skript Anwendung zur Datenbank. FEHLER 1005: Tabelle vipsouth_app kann nicht erstellt werden. #sql-1f48_7 (errno: 150 "über Fremdschlüssel ist falsch gebildet")

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

Könnten Sie eine MySQL-Fehlermeldung zurückgeben? \t Es ist wahrscheinlich, weil Typen nicht gleich sind. Sie versuchen, ein 'COLLATE' (' inspection_id varchar (10) COLLATE utf8_unicode_ci NOT NULL') mit 'tpa_result' (' varchar (10) CHARACTER SET utf8 NOT NULL') zu verknüpfen – Delphine

+0

Ich habe die Frage mit einigen weiteren Details aktualisiert, einschließlich die Fehlermeldung, die ich bekomme. – CJG

+0

Haben Sie versucht, den genau gleichen Typ auf "inspection_id" und "tpa_result" zu setzen? Stellen Sie sicher, dass die Einschränkung 'UNIQUE' für 'tpa_result' aktiviert ist – Delphine

Antwort

0

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

Dies sollte es für Sie tun. Ich habe keinen Fehler bekommen.

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

Wenn ich die Überprüfung von Fremdschlüsseln deaktiviere, erhalte ich immer noch einen Fehler: FEHLER 1822: Fehler beim Hinzufügen des Fremdschlüssel-Constaint. Fehlender Index für Constraint 'inspection_statuses_ibfk_3' in der referenzierten Tabelle 'inspection_responses' – CJG

+0

@CJG - Das hat für mich gut funktioniert. – MontyPython

+0

Ich kann diese 2 'CREATE TABLE' Anweisungen auch ohne Fehler ausführen; Das Problem besteht darin, einen weiteren Fremdschlüssel hinzuzufügen. Ich habe meine Frage aktualisiert, um die Anweisung 'ALTER TABLE' einzuschließen, die den Fehler verursacht. Entschuldigung, ich war nicht genau genug, als ich die Frage ursprünglich gestellt habe. – CJG

Verwandte Themen