2016-07-04 21 views
8

La seguente istruzione create mostra la struttura corrente di una delle mie tabelle MariaDB.Non è possibile rimuovere gli indici

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; 

Devo rimuovere l'indice univoco, tuttavia il tentativo di eliminare uno dei due tasti ha esito negativo.

ALTER TABLE `councilor` 
    DROP INDEX `userId_councilId`; 

/* Errore SQL (1553): Impossibile eliminare l'indice 'userId_councilId': necessario in un vincolo di chiave esterna */

ALTER TABLE `councilor` 
    DROP INDEX `council_user_council_foreign`; 

/* SQL Error (1553): Impossibile eliminare l'indice 'council_user_council_foreign ': necessario in un vincolo di chiave esterna */

La rimozione di tutte le righe della tabella non è di aiuto. Tuttavia, se una nuova tabella viene creata dallo script precedente, il problema non si verificherà.

+0

l'ultimo aggiornamento ha reso l'intera domanda insensata. Pls esamina l'intera domanda e la aggiorna correttamente –

+0

La seguente struttura che hai postato è errata –

+0

Prova la risposta più importante qui: http://stackoverflow.com/questions/15501673/how-to-temporarily-disable-a-foreign-key-constraint -in-mysql –

risposta

5

È necessario innanzitutto eliminare il vincolo FOREIGN KEY, quindi rilasciare l'indice e ricreare la chiave FOREIGN.

3

18:18:46 posizione ALTER TABLE errore DROP INDEX unique_name_to_supplier Codice: 1553. Impossibile eliminare l'indice 'unique_name_to_supplier': necessario in un vincolo di chiave esterna 0,063 sec

Ciò significa che si sta cercando per eliminare l'indice utilizzato per FK.

MySQL richiede indici sulle chiavi esterne e chiavi di riferimento in modo che controlli chiave esterna possono essere veloce e non richiede una scansione di tabella. Nella tabella di riferimento , deve essere presente un indice in cui le colonne chiave esterna sono elencate come prime colonne nello stesso ordine. Tale indice viene creato automaticamente sulla tabella di riferimento se non esiste . Questo indice potrebbe essere rilasciato in modo silenzioso in seguito, se si crea un altro indice che può essere utilizzato per applicare il vincolo di chiave esterna. nome_indice, se specificato, viene utilizzato come descritto in precedenza.

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

Quindi, per risolvere il problema è che è necessario:

1.Get liberarsi di FK

2.Remove indice stesso

3.Creare FK nuovo

Qui ci sono i comandi:

#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; 

registro completo di sql:

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

Siamo spiacenti, ho appena aggiornato la domanda. – PHPst

+0

la mia risposta non è stata utile? –

+0

non c'è fk. – PHPst

4

Bisogna eliminare il vincolo di chiave esterna prima, e che

ALTER TABLE mytable DROP FOREIGN KEY [Foreign_key_constraint_name]; 

e di te c una goccia l'indice