2016-07-04 14 views
8

Die folgende create-Anweisung zeigt die aktuelle Struktur einer meiner MariaDB-Tabellen.Es ist nicht möglich, Indizes zu entfernen

CREATE TABLE `councilor` (
    `id` BIGINT(20) NOT NULL AUTO_INCREMENT, 
    `user` BIGINT(20) NOT NULL, 
    `council` INT(11) NOT NULL, 
    `role` CHAR(50) NOT NULL DEFAULT 'member' COLLATE 'utf8_persian_ci', 
    `cDate` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP, 
    `uDate` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, 
    `startDate` DATETIME NULL DEFAULT NULL, 
    `endDate` DATETIME NULL DEFAULT NULL, 
    `responsibility` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8_persian_ci', 
    `details` TEXT NULL COLLATE 'utf8_persian_ci', 
    PRIMARY KEY (`id`), 
    UNIQUE INDEX `userId_councilId` (`user`, `council`), 
    INDEX `council_user_council_foreign` (`council`) 
) 
COLLATE='utf8_persian_ci' 
ENGINE=InnoDB 
ROW_FORMAT=COMPACT 
AUTO_INCREMENT=11; 

Ich muss den eindeutigen Index entfernen, aber der Versuch, einen der beiden Schlüssel zu löschen, schlägt fehl.

ALTER TABLE `councilor` 
    DROP INDEX `userId_councilId`; 

/* SQL-Fehler (1553): Kann nicht Index löschen 'userId_councilId': benötigen in einem Fremdschlüssel */

ALTER TABLE `councilor` 
    DROP INDEX `council_user_council_foreign`; 

/* SQL-Fehler (1553): Can not drop index ‚council_user_council_foreign ': benötigt in einer Fremdschlüssel-Einschränkung */

Das Entfernen aller Tabellenzeilen hilft auch nicht. Wenn jedoch eine neue Tabelle von dem obigen Skript erstellt wird, wird das Problem nicht auftreten.

+0

Sie letzte Aktualisierung gemacht ganze Frage sinnlos. Bitte überprüfen Sie die ganze Frage und aktualisieren Sie sie richtig –

+0

Die folgende Struktur, die Sie gepostet haben, ist falsch –

+0

Versuchen Sie die beste Antwort hier: http://stackoverflow.com/questions/15501673/how-to-temporary-disable-a-foreign-key-constraint -in-mysql –

Antwort

5

Sie müssen zuerst die FOREIGN KEY-Einschränkung löschen, dann den Index löschen und den FOREIGN-Schlüssel neu erstellen.

3

18:18:46 ALTER TABLE Lage DROP INDEX unique_name_to_supplier Fehler Code: benötigt in einem Fremdschlüssel 0,063 sec

Das heißt, Sie versuchen: 1553 Index 'unique_name_to_supplier' fallen kann nicht um den Index zu löschen, der für FK verwendet wurde.

MySQL erfordert Indizes für Fremdschlüssel und referenzierten Schlüssel, so dass Fremdschlüsselprüfungen schnell sein kann und nicht einen Tabellenscan erfordern. In der referenzierenden Tabelle muss ein Index vorhanden sein, in dem die Spalten des Fremdschlüssels als erste Spalten in derselben Reihenfolge aufgelistet sind. Ein solcher Index wird automatisch in der referenzierenden Tabelle erstellt, wenn er nicht existiert . Dieser Index wird möglicherweise später automatisch gelöscht, wenn Sie einen anderen Index erstellen, der zum Erzwingen der Fremdschlüsseleinschränkung verwendet werden kann. index_name, falls angegeben, wird wie zuvor beschrieben verwendet.

http://dev.mysql.com/doc/refman/5.7/en/create-table-foreign-keys.html

So zu beheben ist, was Sie brauchen:

1.Get los

FK

2.Remove Index selbst

3.Erstellen FK wieder

Hier sind die Befehle:

#removing FK 
    ALTER TABLE `location` DROP FOREIGN KEY `FK_SUPPLIER`; 

#droping unique Index 
    ALTER TABLE `location` DROP INDEX `unique_name_to_supplier` ; 

#creating new FK with proper Index  
    ALTER TABLE `location` 
    ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC); 
    ALTER TABLE `location` 
    ADD CONSTRAINT `FK_SUPPLIER` 
     FOREIGN KEY (`supplier_id`) 
     REFERENCES `supplier` (`id`) 
     ON DELETE NO ACTION 
     ON UPDATE NO ACTION; 

vollständige SQL Log:

mysql> 
mysql> CREATE TABLE supplier (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY 
    ->) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.38 sec) 

mysql> CREATE TABLE location (
    -> id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    -> name VARCHAR(10) NOT NULL, 
    -> supplier_id INT UNSIGNED NOT NULL 
    ->) ENGINE=InnoDB; 
Query OK, 0 rows affected (0.32 sec) 

mysql> ALTER TABLE location ADD CONSTRAINT FK_SUPPLIER FOREIGN KEY FK_SUPPLIER (supplier_id) 
    -> REFERENCES supplier (id) ON DELETE RESTRICT ON UPDATE RESTRICT; 
Query OK, 0 rows affected (0.41 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE location ADD UNIQUE INDEX unique_name_to_supplier (supplier_id,name); 
Query OK, 0 rows affected (0.24 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> show create table location; 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table 
                                   | 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| location | CREATE TABLE `location` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(10) NOT NULL, 
    `supplier_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `unique_name_to_supplier` (`supplier_id`,`name`), 
    CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 

mysql> 
mysql> 
mysql> 
mysql> ALTER TABLE `location` DROP FOREIGN KEY `FK_SUPPLIER`; 
Query OK, 0 rows affected (0.17 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> 
mysql> ALTER TABLE `location` DROP INDEX `unique_name_to_supplier` ; 
Query OK, 0 rows affected (0.09 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> 
mysql> ALTER TABLE `location` 
    -> ADD INDEX `FK_SUPPLIER_idx` (`supplier_id` ASC); 
Query OK, 0 rows affected (0.08 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> ALTER TABLE `location` 
    -> ADD CONSTRAINT `FK_SUPPLIER` 
    -> FOREIGN KEY (`supplier_id`) 
    -> REFERENCES `supplier` (`id`) 
    -> ON DELETE NO ACTION 
    -> ON UPDATE NO ACTION; 
Query OK, 0 rows affected (0.68 sec) 
Records: 0 Duplicates: 0 Warnings: 0 

mysql> show create table location 
    -> ; 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table 
                                        | 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| location | CREATE TABLE `location` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `name` varchar(10) NOT NULL, 
    `supplier_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `FK_SUPPLIER_idx` (`supplier_id`), 
    CONSTRAINT `FK_SUPPLIER` FOREIGN KEY (`supplier_id`) REFERENCES `supplier` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 | 
+----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
+0

Sorry, ich habe gerade die Frage aktualisiert. – PHPst

+0

meine Antwort war nicht hilfreich? –

+0

gibt es keine fk. – PHPst

4

Sie haben die Fremdschlüssel zuerst fallen zu lassen, und dass

ALTER TABLE mytable DROP FOREIGN KEY [Foreign_key_constraint_name]; 

und als Sie c ein Tropfen der Index

Verwandte Themen