2016-07-04 48 views
8

Aşağıdaki create ifadesi, MariaDB tablolarımın birinin mevcut yapısını gösterir.Dizinleri kaldırmak mümkün değil.

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; 

Benzersiz dizini kaldırmam gerekiyor, ancak iki anahtardan birini silmeye çalışıyorum.

ALTER TABLE `councilor` 
    DROP INDEX `userId_councilId`; 

/* SQL Hatası (1553): endeksi bırakamazsınız 'userId_councilId': endeksi bırakamazsınız 'council_user_council_foreign: Bir yabancı anahtar kısıtlaması */

ALTER TABLE `councilor` 
    DROP INDEX `council_user_council_foreign`; 

/* SQL Hatası (1553) gerekli ': yabancı anahtar kısıtlaması gerekli */

Tüm tablo satırlarının kaldırılması da işe yaramıyor. Ancak, yukarıdaki komut dosyası tarafından yeni bir tablo oluşturulursa sorun oluşmaz.

+0

son güncellenen tüm soru anlamsız yaptı. Pls tüm soru gözden ve düzgün güncellendi –

+0

Gönderdiğiniz Yapı yanlış –

+0

Buraya en iyi cevabı deneyin: http://stackoverflow.com/questions/15501673/how-to-temporarily-disable-a-foreign-key-constraint -in-mysql –

cevap

5

Önce FOREIGN KEY kısıtlamasını bırakmanız, ardından dizini bırakmanız ve FOREIGN anahtarını yeniden oluşturmanız gerekir.

3

18:18:46 ALTER tablo konumu drop INDEX unique_name_to_supplier Hata Kodu: 1553 endeksi 'unique_name_to_supplier' bırakamazsınız: Bir yabancı anahtar kısıtlaması gerekli 0.063 sn

Bu çalışıyoruz demektir FK için kullanılan indeksi silmek için. Dış anahtar kontrolünü hızlı olmak ve bir tablo taraması gerektirmeyen böylece

MySQL yabancı anahtarlar ve başvurulan tuşlarda endeksleri gerektirir. başvuru tablosunda, yabancı anahtarın sütunlarının aynı sıradaki ilk sütunlar olarak listelendiği bir dizin olmalıdır. Böyle bir endeksi mevcut değilse referans tablosunda otomatik olarak oluşturulur. Yabancı dizin kısıtlamasını zorlamak için başka bir dizin oluşturursanız, bu dizin daha sonra sessizce bırakılabilir. index_name, eğer verilmişse, daha önce açıklandığı gibi kullanılır.

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

Yani düzeltmek için ihtiyacınız olan:

1.Get

2.Remove endeksi kendisi

3 FK

kurtulmak.FK oluştur tekrar İşte

komutlar şunlardır:

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

tam sql günlüğü:

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

Üzgünüm, sorumu yeni güncelledim. – PHPst

+0

Cevabım yardımcı olmadı mı? –

+0

fk yoktur. – PHPst

4
Önce yabancı anahtar kısıtlaması bırak zorunda

ve bu

ALTER TABLE mytable DROP FOREIGN KEY [Foreign_key_constraint_name]; 

ve sizden daha Bir damla endeks