Yabancı anahtar kısıtlamasını atlayarak mysql düşmesini zorla


134

Biri dışında bir veritabanından tüm tabloları silmeye çalışıyorum ve ben aşağıdaki hataya sahip:

Bir üst satır silinemez veya güncellenemez: yabancı anahtar kısıtlaması başarısız

Tabii ki bu anahtar kısıtlamaların ne olduğunu görmek için deneme yanılma yapabilir ve sonunda tüm tabloları silebilirim, ancak tüm tabloları bırakmanın zorlanmasının hızlı bir yolu olup olmadığını bilmek istiyorum (bunları yeniden ekleyebileceğim için) silinmesini istemiyorum).

Google beni aşağıdaki yöntemi öneren bir siteye yöneltti:

mysql> SET foreign_key_checks = 0;
mysql> drop table ...
mysql> SET foreign_key_checks = 1;

Kısa cevap, bazı tabloları silebilirken aynı hatayı aldım çünkü gerçekten hile yapmadı. Belirli bir tabloya bağlı tüm yabancı anahtarları almak için Stack Overflow yollarında gördüm ama hepsini komut (sürece başka seçenek yok yapılabilir) sürece bu çok zaman alıcı

Veritabanı 4.1 olduğu için kullanamıyorum DROP DATABASE

Fikirler?


1
Sorunuza çözüm bile vermeyen cevabı neden seçildiği gibi seçtiniz?
Sanjay

Yanıtlar:


-40

Herhangi bir veri tutmak istemediğiniz için , tüm veritabanını bırakın ve yeni bir veritabanı oluşturun.


3
Oh my, şimdi kendimi çok aptal hissediyorum, daha sonra eklemek yerine veritabanının gerçek adı ile DATABASE kelimesini yerine, her ikisi de +1
johnnyArt

13
bu cevap değil
Freelancer

8
Bu cevabın işaretlendiğini ve yukarı çıktığını görmek çok komik
tom10271

4
@RobertPounder tam olarak amacımdı ve bu siteye katıldığımdan beri oldu. Görüşünüzü takdir ediyorum.
Otávio Décio

3
@RobertPounder SO, OP'lere yardım etmekten biraz daha fazlası, aranabilir bir "nasıl yapılır" kaynağı anlamına geliyor, yabancı anahtar kısıtlama kontrollerini devre dışı bırakmam gerektiğinden bu konuya indim ve Google beni buraya yönlendirdi. Ben veritabanı bırakarak OP için iyi bir geçici çözüm oldu mutluyum, ama aşağıdaki cevap aslında "Zorla yabancı anahtar kısıtlama bypassing mysql bırakma" sorusu için doğrudur.
Val Redchenko

404

Bu, aramadan biten biri için yararlı olabilir. Bir görünümü değil tabloyu bırakmaya çalıştığınızdan emin olun .

Set foreign_key_checks = 0;
- Damla masaları
açılır masa ...
- Damla görüntüleme sayısı
açılır görüntü ...
Set foreign_key_checks = 1;

SET foreign_key_checks = 0yabancı anahtar denetimlerini kapalı SET foreign_key_checks = 1olarak ayarlamak ve ardından yabancı anahtar denetimlerini yeniden ayarlamaktır. Kontroller kapalıyken tablolar atılabilir, daha sonra tablo yapısının bütünlüğünü korumak için kontroller tekrar açılır.


43
PAT benim arkadaşım!
SeanDowney

5
Bu daha doğru bir cevap. Tüm tabloları veya sadece birkaçını silme sorununu çözer. Müthiş!
Luke Stevenson

@PAT Çok teşekkür ederim, işe yaradı. Ancak Mysql Sorgu tarayıcısında çalışamadı. Günümü kurtardın.
MaNn

mükemmel çalıştı, bunu kullandım çünkü tüm veritabanını
bırakamıyorum

1
Bunun normalde doğru çözüm olduğunu kabul ediyorum, ancak soruyu soran @johnnyArt, onun için işe yaramadığı için bunu uygun bir seçenek olarak özellikle hariç tuttu. Yani bu asıl soru için doğru cevap değil gibi görünüyor, değil mi?
David

18

Eğer phpmyadmin kullanıyorsanız bu özellik zaten oradadır.

  • Bırakmak istediğiniz tabloları seçin
  • Tablolar listesinin altındaki açılır menüden açılır listeyi seçin
  • Altta "Yabancı anahtar kontrolü" yazan onay kutusunun bulunduğu yeni bir sayfa açılacaktır.
  • "Evet" seçeneğini kabul ederek silme işlemini onaylayın.

3
Günümü kurtardın! Teşekkürler! Bir cazibe gibi çalıştı!
Kami

4

Aşağıdaki adımları kullanabilirsiniz, onun kısıtlama ile tablo bırakmak benim için çalıştı, çözüm zaten yukarıdaki açıklamada açıklanan, ben sadece bunun için ekran görüntüsü ekledi -resim açıklamasını buraya girin


Bu, dört yıl önce yayınlanan en yüksek oyu alan cevabın bir kopyası.
chb

3

Drop veritabanı MySQL'in tüm sürümlerinde mevcuttur. Ancak tablo yapısını korumak istiyorsanız, işte bir fikir

mysqldump --no-data - add-drop-database - add-drop-table -hHOSTNAME -uUSERNAME -p> dump.sql

Bu bir program, mysql komutu değil

Ardından, mysql'de oturum açın ve

kaynak dökümü.sql;


1

Terminalden bir kerede tüm masayı bırakmak için basit bir çözüm.

Bu mysql kabuğunuzda birkaç adım içeriyordu (tek adımda bir çözüm değil), bu bana çalıştı ve günümü kurtardı.

Sunucu sürümü için çalıştı: 5.6.38 MySQL Topluluk Sunucusu (GPL)

İzlediğim adımlar:

 1. generate drop query using concat and group_concat.
 2. use database
 3. turn off / disable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 0;), 
 4. copy the query generated from step 1
 5. re enable foreign key constraint check (SET FOREIGN_KEY_CHECKS = 1;)
 6. run show table

MySQL kabuğu

$ mysql -u root -p
Enter password: ****** (your mysql root password)
mysql> SYSTEM CLEAR;
mysql> SELECT CONCAT('DROP TABLE IF EXISTS `', GROUP_CONCAT(table_name SEPARATOR '`, `'), '`;') AS dropquery FROM information_schema.tables WHERE table_schema = 'emall_duplicate';
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| dropquery                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`; |
+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> USE emall_duplicate;
Database changed
mysql> SET FOREIGN_KEY_CHECKS = 0;                                                                                                                                                   Query OK, 0 rows affected (0.00 sec)

// copy and paste generated query from step 1
mysql> DROP TABLE IF EXISTS `admin`, `app`, `app_meta_settings`, `commission`, `commission_history`, `coupon`, `email_templates`, `infopages`, `invoice`, `m_pc_xref`, `member`, `merchant`, `message_templates`, `mnotification`, `mshipping_address`, `notification`, `order`, `orderdetail`, `pattributes`, `pbrand`, `pcategory`, `permissions`, `pfeatures`, `pimage`, `preport`, `product`, `product_review`, `pspecification`, `ptechnical_specification`, `pwishlist`, `role_perms`, `roles`, `settings`, `test`, `testanother`, `user_perms`, `user_roles`, `users`, `wishlist`;
Query OK, 0 rows affected (0.18 sec)

mysql> SET FOREIGN_KEY_CHECKS = 1;
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW tables;
Empty set (0.01 sec)

mysql> 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.