MySQL veritabanındaki tüm tabloları tek bir komutta mı keseceksiniz?


347

Bir işlemdeki bir veritabanındaki tüm tabloları kısaltmak için bir sorgu (komut) var mı? Bunu tek bir sorgu ile yapabilir miyim bilmek istiyorum.


1
Tüm tablolar kesilsin mi? veritabanındaki tüm tabloların tüm sütunlarını kısaltmak mı istiyorsun? Bu hangi sorgu dilinde? (örn. SQL, MySQL, Oracle, Postgres, vb.)
Jay

Im çok kolay kendinizi belaya alabilirsiniz gibi bunu tavsiye ederim emin değilim. Sadece kesikleri komut dosyası ve komut dosyası çalıştırmak olamaz bir nedeni var mı?
GrayWizardx

teşekkürler 4 cevap ama komut dosyası değil sadece neden çok az çalışıyor mysql bir çalışma runnind düşündüm
devang

ya onun mysql..and sorgu kesmek tablo table_name benzer bir şey anlamına gelir .. burada bir sorguda benim db tüm tabloların tüm satırları
kısaltmak istiyorum

Information_Schema'yı bir imleçle kullanabilirsiniz. MySql hakkında emin değilim, ancak Information_Schema.Table'ları desteklemeli
GrayWizardx

Yanıtlar:


340

Bırak (tabloları kaldır)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done

Kesme (yani boş tablolar)

mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done

17
Evet, temiz, ty. Ancak bunu -uUSER -pPASSWORD ile çalıştırmanız gerekebilir. Ayrıca, art arda silme işlemine sahipseniz, birden çok kez çalıştırmanız gerekebilir.
mihaicc

47
" Bir üst satır silinemiyor veya güncellenemiyor: yabancı anahtar kısıtlaması başarısız " gibi FK sorunlarıyla karşılaşırsanız , komutu aşağıdaki gibi değiştirerek yabancı anahtar kontrollerini devre dışı bıraktığınızdan emin olun:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.

24
Gerçi mysql istemcisi döngü gerek yok. mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Aşağıdaki

2
@TylerCollier bir .my.cnf
Felix Eve

2
Yukarıdaki cevap ve yorumlara dayanarak, benim için beklendiği gibi çalışmadığı için, bunun için kullanabileceğiniz basit bir bash betiği yaptım. Bunu şu adreste bulabilirsiniz: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

Mysql örneğinde birden çok veritabanı tablosunu kesme

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('db1_name','db2_name');

Tabloları kısaltmak için Sorgu Sonucu'nu kullanma

Not: belki bu hatayı alırsınız:

ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails

Bu, bırakmaya / kesmeye çalıştığınız tabloya yabancı anahtar başvuruları içeren tablolar varsa olur.

Tabloları kesmeden önce Tek yapmanız gereken:

SET FOREIGN_KEY_CHECKS=0;

Tablolarınızı kısaltın ve tekrar

SET FOREIGN_KEY_CHECKS=1;

1
Veritabanınız için bir kullanıcı ve parolanız varsa ve bunları kabuğunuza görünür bir şekilde yazmak istemiyorsanız, bu muhtemelen en iyi çözümdür.
Bach

5
Bu çözüm SSH erişimi değil yalnızca DB erişimi gerektirdiği için seçildi. Ayrıca işletim sisteminden bağımsızdır.
mastazi

@mastazi birkaç sorum var: 1. "table_schema" ne anlama geliyor? şema adında duruyor mu? 2.TABLE_NAME ne anlama geliyor? silinmesi gereken tablolar için ayakta mı? 3. "('db1_name', 'db2_name')" gibi komutun silinmesi gereken tabloları uzun yazmalı mıyım?
AAEM

@ Gereken tek değişiklik, db1_name ve db2_name'i veritabanlarınızın adlarıyla değiştirmeniz gerektiğidir. Sonra bu sorgunun sonuçlarını kopyalamanız ve yeni bir mysql sorgusu olarak yapıştırmanız ve yürütmeniz gerekir. BİLGİ_SCHEMA, her MySQL kurulumunda önceden yüklenmiş olarak gelen ve veritabanlarınız hakkında bilgi tutan yerleşik bir şemadır, dokunmayın veya MySQL'iniz yanlış davranmaya başlayacaktır :-) table_schema ve table_name içindeki tablolar "TABLOLAR" information_schema
mastazi

"db_name" ile, şemanın adını mı kastediyorsunuz? Ben sadece onun tablo verilerini silmek istediğiniz 1 şeması var
AAEM

67

PhpMyAdmin'i şu şekilde kullanın:

Veritabanı Görünümü => Tümünü Kontrol Et (tablolar) => Boş

Yabancı anahtar kontrollerini yoksaymak istiyorsanız, şu kutunun işaretini kaldırabilirsiniz:

[] Yabancı anahtar kontrollerini etkinleştir

Bu onay kutusunu almak için en az 4.5.0 veya daha yeni bir sürümü çalıştırmanız gerekir.

MySQL CLI-fu değil, ama hey, işe yarıyor!


31
PHP çalıştırdığımızı kim söyledi?
jsh

37
Kim demedi? Bu cevabın görünüşe göre insanlar için yararlı olduğu kanıtlanmıştır; yardımcı olur.
bzeaman

2
Bir üst-alt veritabanı şemanız varsa, bu çalışmaz.
Cary Bondoc

2
Yabancı anahtar kısıtlaması başarısız.
Brian Hannay

2
O Haziran 2015 yılında PMA 4.5.0 eklendi @BrianHannay buldum changelog ve özgün sorunu
Nemo

24

MS SQL Server 2005+ (Gerçek yürütme için PRINT'i kaldır ...)

EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''

Veritabanı platformunuz BİLGİ_SCHEMA görünümlerini destekliyorsa, aşağıdaki sorgunun sonuçlarını alın ve yürütün.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

MySQL için şunu deneyin:

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES

Concat'a noktalı virgül eklemek, örneğin mysql çalışma tezgahından kullanmayı kolaylaştırır.

SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES

merhaba .. d cevap için teşekkür ederim bu sorguyu denedim ama çalışmıyor gibi görünüyor ... der benim tablodaki tüm tablolar için kullanabileceğiniz kesme tablo table_name gibi bir şey ..
devang

MySQL'in "+" operatörünü doğrudan desteklemediğini unuttum. Hata olduğunu varsayarak, yukarıdaki CONCAT () örneğini ekledim. Hala bir hata mesajı alıyorsanız, lütfen asıl hata mesajını paylaşın.
plaj

Bu sorgu çalışır ama bir diff db adı örneğin devang..is benim db adı varsa, bu yüzden yukarıdaki sorguya göre kullanırsanız foll hata atar .. Tablo 'devang.TABLES' yok
devang

3
Ahh. BİLGİ_SCHEMA, etkin veritabanında bulunan bir görünümdür. Veritabanınızı değiştirirseniz, görünüm bu DB'ye karşı yürütülür. Veritabanlarını değiştirirken sorguyu değiştirmeye gerek yoktur. Sadece şu adımları izleyin: 1) aktif veritabanını değiştirin. 2) komut dosyasını çalıştırın. 3) sonuçları kopyalayın 4) sonuçları tekrar düzenleyiciye yapıştırın 5) sonuçları yürütün. Etkin veritabanındaki tüm tablolar artık kesiliyor.
plaj

1
DİKKAT! Bu, tüm veritabanlarındaki tüm tabloları seçer (geçerli veritabanında DEĞİL olanlar bile. MySQL örneği işe yaramaz, ancak benim durumumda 66 yerine 293 satır (tablo) döndürdü. Veri kaybını hayal edin ...
f4der

19

Bir veritabanındaki tüm tabloları bırakmak için buldum:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME

Barındırma çözümü ile sınırlıysanız (tüm veritabanını bırakamazsanız) yararlıdır.

Tabloları kısaltmak için değiştirdim. Hiçbir "- add-truncate-table" mysqldump için, bu yüzden yaptım:

mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | sed -e 's/DROP TABLE IF EXISTS/TRUNCATE TABLE/g' | mysql -uUSERNAME -pPASSWORD DATABASENAME

benim için çalışıyor - edit, son komutta bir yazım hatasını düzeltiyor


15
SET FOREIGN_KEY_CHECKS = 0;

SELECT @str := CONCAT('TRUNCATE TABLE ', table_schema, '.', table_name, ';')
FROM   information_schema.tables
WHERE  table_type   = 'BASE TABLE'
  AND  table_schema IN ('db1_name','db2_name');

PREPARE stmt FROM @str;

EXECUTE stmt;

DEALLOCATE PREPARE stmt;

SET FOREIGN_KEY_CHECKS = 1;

Mevcut veritabanı ile çalışmak (ve bu nedenle bu kodu taşınabilir yapmak) istiyorsanız, son koşulu şu şekilde değiştirin SELECT:AND table_schema = DATABASE();
alx

Benim için kısalmıyor. MySQL 5.7.25
Lucas Bustamante

14

Sadece aşağıdaki kod gibi bir şey yapmak en basit buldum, sadece tablo isimlerini kendi ile değiştirin. önemli Son satırın daima SET FOREIGN_KEY_CHECKS = 1 olduğundan emin olun;

SET FOREIGN_KEY_CHECKS=0;
TRUNCATE `table1`;
TRUNCATE `table2`;
TRUNCATE `table3`;
TRUNCATE `table4`;
TRUNCATE `table5`;
TRUNCATE `table6`;
TRUNCATE `table7`;
SET FOREIGN_KEY_CHECKS=1;

7
SET FOREIGN_KEY_CHECKS = 0 ayarını tekrarlamanız gerekmez; sadece başlangıç ​​satırında modu 0 olarak işaretleyecek her TRUNCATE komutundan sonra
HMagdy

12

Bu, tüm tabloları kısaltmak için komutu yazdırır:

SELECT GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');

5
  1. Bir tabloyu kısaltmak için, bu tablodaki sütunlarla eşlenen yabancı anahtar kısıtlamalarını diğer tablolardan (aslında belirli DB / Şemadaki tüm tablolarda) bırakmak gerekir.
  2. Bu nedenle, tüm yabancı anahtar kısıtlamalarının başlangıçta tablo kesilmesi ile düşürülmesi gerekir.
  3. İsteğe bağlı olarak, veri kesme işleminden sonra kullanılan veri alanını / boyutunu OS'ye geri almak için optimizasyon tablosunu (mysql, innodb engine esp içinde) kullanın.
  4. Veri kesme işlemi yapıldıktan sonra, aynı yabancı anahtar kısıtlamalarını aynı tabloda tekrar oluşturun. Yukarıdaki işlemleri gerçekleştirmek için komut dosyasını oluşturacak bir komut dosyasının aşağısına bakın.

    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    UNION
    SELECT CONCAT('TRUNCATE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('OPTIMIZE TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,';') FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_SCHEMA='<TABLE SCHEMA>' AND TABLE_TYPE='BASE TABLE'
    UNION
    SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' ADD CONSTRAINT ',CONSTRAINT_NAME,' FOREIGN KEY(',COLUMN_NAME,')',' REFERENCES ',REFERENCED_TABLE_NAME,'(',REFERENCED_COLUMN_NAME,');') FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE CONSTRAINT_NAME LIKE 'FK%' AND TABLE_SCHEMA='<TABLE SCHEMA>'
    INTO OUTFILE "C:/DB Truncate.sql" LINES TERMINATED BY '\n';

Şimdi, oluşturulan Db Truncate.sql komut dosyasını çalıştırın

Yararları. 1) Disk alanını geri kazanın 2) DB / Şemayı aynı yapıda bırakmak ve yeniden oluşturmak gerekmez

Dezavantajları. 1) FK kısıtlamaları, tablodaki sınırlama adında 'FK' adının bulunduğu adlar olmalıdır.


3

sql server 2005 kullanıyorsanız, bir veritabanındaki tüm tablolara karşı bir komut veya komut kümesi yürütmenizi sağlayan gizli bir saklı yordam vardır. TRUNCATE TABLEBu saklı yordam ile nasıl arayacağınız aşağıda açıklanmıştır :

EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"

İşte daha ayrıntılı olarak hazırlanmış iyi bir makale.

Bununla birlikte, MySql için, mysqldump kullanabilir ve verileri görmezden gelen tüm tabloları bırakmak ve oluşturmak için --add-drop-tablesve --no-dataseçeneklerini belirtebilirsiniz . bunun gibi:

mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]

dev.mysql mysqldump kullanım kılavuzu


3

Bunu kullanın ve sorguyu oluşturun

SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
FROM INFORMATION_SCHEMA.TABLES where  table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';

Şimdi bu sorguyu kullanmak için bunu kullanın

mysql -u username -p </path/to/file.sql

böyle bir hata alırsan

ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint

geçmenin en kolay yolu dosyanızın en üstünde bu satırı ekleyin

SET FOREIGN_KEY_CHECKS=0;

yani bu dosyadan geçerken yabancı anahtar kısıtlamalarını kontrol etmek istemiyoruz.

Db1 ve bd2 veritabanlarındaki tüm tabloları kesecektir.


db isimleri qoutes olmalıdır
Roman M


2

İşte benim varyantı 'hepsini hepsini kısaltmak için bir ifadeye' sahip olmak.

İlk olarak, yardımcı saklı yordamlar için 'util' adlı ayrı bir veritabanı kullanıyorum. Tüm tabloları kısaltmak için saklı yordamın kodu:

DROP PROCEDURE IF EXISTS trunctables;
DELIMITER ;;
CREATE  PROCEDURE trunctables(theDb varchar(64))
BEGIN
    declare tname varchar(64);
    declare tcursor CURSOR FOR 
    SELECT table_name FROM information_schema.tables WHERE table_type <> 'VIEW' AND table_schema = theDb;
    SET FOREIGN_KEY_CHECKS = 0; 
    OPEN tcursor;
    l1: LOOP
        FETCH tcursor INTO tname;
        if tname = NULL then leave l1; end if;
        set @sql = CONCAT('truncate `', theDB, '`.`', tname, '`');
        PREPARE stmt from @sql;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;
    END LOOP l1;
    CLOSE tcursor;
    SET FOREIGN_KEY_CHECKS = 1; 
END ;;
DELIMITER ;

Bu saklı yordamı util veritabanınızda aldıktan sonra, şöyle çağırabilirsiniz

call util.trunctables('nameofdatabase');

hangi şimdi tam olarak bir ifade :-)


2

burada biliyorum burada

   SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') 
    FROM INFORMATION_SCHEMA.TABLES where  table_schema in ('databasename1','databasename2');

Bir üst satırı silemez veya güncelleyemezse: yabancı anahtar kısıtlaması başarısız olur

Bu, bırakmaya / kesmeye çalıştığınız tabloya yabancı anahtar başvuruları içeren tablolar varsa olur.

Tabloları kesmeden önce Tek yapmanız gereken:

SET FOREIGN_KEY_CHECKS=0;

Tablolarınızı kısaltın ve tekrar

SET FOREIGN_KEY_CHECKS=1; 

bu php kodunu kullan

    $truncate = mysql_query("SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';') as tables_query FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename')");

    while($truncateRow=mysql_fetch_assoc($truncate)){

        mysql_query($truncateRow['tables_query']);

    }
?>

detayı buradan kontrol et link


1

İşte yerel veritabanındaki tüm tabloları kısaltan bir yordam.

Çalışmıyorsa bana bildirin, bu cevabı sileceğim.

Test edilmemiş

CREATE PROCEDURE truncate_all_tables()
BEGIN

   -- Declare local variables
   DECLARE done BOOLEAN DEFAULT 0;
   DECLARE cmd VARCHAR(2000);

   -- Declare the cursor
   DECLARE cmds CURSOR
   FOR
   SELECT CONCAT('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES;

   -- Declare continue handler
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   -- Open the cursor
   OPEN cmds;

   -- Loop through all rows
   REPEAT

      -- Get order number
      FETCH cmds INTO cmd;

      -- Execute the command
      PREPARE stmt FROM cmd;
      EXECUTE stmt;
      DROP PREPARE stmt;

   -- End of loop
   UNTIL done END REPEAT;

   -- Close the cursor
   CLOSE cmds;

END;

Bunun neden işe yaramadığını anlamak için çok zaman aldım .. O zaman bu e-posta dizisine yorum yapmak yardımcı oldu: forums.mysql.com/read.php?61,116597,219343#msg-219343 - Referans için : "Ne yazık ki, ifadeler hazırlamak imleçlerde kullanılamaz gibi görünüyor. Kılavuzdan: dev.mysql.com/doc/refman/6.0/en/… "
Tominator

1

TRUNCATE TABLE .. bir NOCHECK CONSTRAINT ALL sonra bile, yabancı anahtar kısıtlamaları ile ilgili sorun olduğunu, bu yüzden bunun yerine bir DELETE FROM deyimi kullanın. Bu, kimlik tohumlarının sıfırlanmadığı anlamına gelir, bunu başarmak için her zaman bir DBCC CHECKIDENT ekleyebilirsiniz.

I Çalıştırmadan önce veritabanındaki tüm tabloları kesmek için sql mesaj penceresine yazdırmak için aşağıdaki kodu kullanın. Bir hata yapmayı biraz zorlaştırıyor.

EXEC sp_MSforeachtable 'PRINT ''ALTER TABLE ? NOCHECK CONSTRAINT ALL'''
EXEC sp_MSforeachtable 'print ''DELETE FROM ?'''
EXEC sp_MSforeachtable 'print ''ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all'''

0

Emin değilim ama ben veritabanı şemasını yeni veritabanına kopyalayabilirsiniz kullanarak bir komut olduğunu düşünüyorum, bunu yaptıktan sonra eski veritabanını silebilirsiniz ve bundan sonra tekrar eski veritabanı veritabanı şemasını kopyalayabilirsiniz.


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Bu yalnızca şema ile bir sql dosyası oluşturur (veri yok). Bu komuttan sonra veri tabanını silebilir ve şemayı içe aktararak veritabanını yeniden oluşturabilirsiniz.
GJ.

0

Bu tam olarak bir komut olmadığını biliyorum, ancak phpMyAdmin içinde istenen sonuç aşağıdaki adımları izleyerek elde edilebilir:

  1. Kaldırılacak tabloları (tümü) seçin (Tümünü Kontrol Et)
  2. "Seçili:" listesinden "Bırak" / "Kes" seçeneğini belirleyin
  3. Onay sayfasında ("Gerçekten yapmak istiyor musunuz:") sorguyu kopyalayın (kırmızı arka plana sahip her şey)
  4. En üste gidin ve SQL'e tıklayın ve şunu yazın: "SET FOREIGN_KEY_CHECKS = 0;" sonra önceden kopyalanan sorguyu yapıştırın
  5. "Git" i tıklayın

Fikir, tüm tabloları hızlı bir şekilde veritabanından (5 saniye ve 2 tıklama ile yaptığınız) almak, ancak önce yabancı anahtar kontrollerini devre dışı bırakmaktır. Hiçbir CLI ve hiçbir veritabanı bırakarak ve tekrar ekleme.


0
TB=$( mysql -Bse "show tables from DATABASE" );
for i in ${TB};
    do echo "Truncating table ${i}";
    mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table DATABASE.${i}; set foreign_key_checks=1; set unique_checks=1";
    sleep 1;
done

-

David,

Kodu biçimlendirmek için zaman ayırdığınız için teşekkür ederiz, ancak bu şekilde uygulanması gerekiyordu.

-Kurt

UNIX veya Linux kutusunda:

Bir bash kabuğunda olduğunuzdan emin olun. Bu komutlar, komut satırından aşağıdaki gibi çalıştırılmalıdır.

Not:

Kimlik bilgilerimi ~ / .my.cnf dosyamda saklıyorum, bu yüzden bunları komut satırında sağlamam gerekmiyor.

Not:

cpm veritabanı adıdır

Her komuttan elde edilen sonuçların sadece küçük bir örneğini gösteriyorum.

Yabancı anahtar kısıtlamalarınızı bulun:

klarsen@Chaos:~$ mysql -Bse "select concat(table_name, ' depends on ', referenced_table_name)
             from information_schema.referential_constraints
             where constraint_schema = 'cpm'
             order by referenced_table_name"
  1. confirm_external_system onay_oruluna bağlıdır
  2. adres müşteriye bağlıdır
  3. customer_identification müşteriye göre değişir
  4. external_id müşteriye bağlıdır
  5. kimlik bilgisi müşteriye bağlıdır
  6. email_address müşteriye bağlıdır
  7. confirm_request müşteriye bağlıdır
  8. customer_status müşteriye bağlıdır
  9. customer_image müşteriye bağlıdır

Tabloları ve satır sayılarını listeleyin:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 297
 2  approval_external_system    0
 3  approval_request    0
 4  country 189
 5  credential  468
 6  customer    6776
 7  customer_identification 5631
 8  customer_image  2
 9  customer_status 13639

Tablolarınızı kısaltın:

klarsen@Chaos:~$ TB=$( mysql -Bse "show tables from cpm" ); for i in ${TB}; do echo "Truncating table ${i}"; mysql -e "set foreign_key_checks=0; set unique_checks=0;truncate table cpm.${i}; set foreign_key_checks=1; set unique_checks=1"; sleep 1; done
  1. Kesme tablosu adresi
  2. Kesme tablosu onay_external_system
  3. Kesme tablosu onay_sorusu
  4. Kırpma tablosu ülkesi
  5. Kesme tablosu kimlik bilgileri
  6. Kesme masası müşterisi
  7. Kesme tablosu müşteri_kimliği
  8. Kesme tablosu customer_image
  9. Kesme tablosu customer_status

Çalıştığını doğrulayın:

klarsen@Chaos:~$ mysql -Bse "SELECT table_name, table_rows FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'cpm'" | cat -n

 1  address 0
 2  approval_external_system    0
 3  approval_request    0
 4  country 0
 5  credential  0
 6  customer    0
 7  customer_identification 0
 8  customer_image  0
 9  customer_status 0
10  email_address   0

Windows kutusunda:

NOT:

cpm veritabanı adıdır

C:\>for /F "tokens=*" %a IN ('mysql -Bse "show tables" cpm') do mysql -e "set foreign_key_checks=0; set unique_checks=0; truncate table %a; foreign_key_checks=1; set unique_checks=1" cpm

0

Aşağıdaki MySQL sorgusu, belirli bir veritabanındaki tüm tabloları kesecek tek bir sorgu üretir. YABANCI tuşları atlar:

SELECT CONCAT(
         'SET FOREIGN_KEY_CHECKS=0; ',
         GROUP_CONCAT(dropTableSql SEPARATOR '; '), '; ',
         'SET FOREIGN_KEY_CHECKS=1;'
       ) as dropAllTablesSql
FROM   ( SELECT  Concat('TRUNCATE TABLE ', table_schema, '.', TABLE_NAME) AS dropTableSql
         FROM    INFORMATION_SCHEMA.TABLES
         WHERE   table_schema = 'DATABASE_NAME' ) as queries

0
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql

0

Soln 1)

mysql> select group_concat('truncate',' ',table_name,';') from information_schema.tables where table_schema="db_name" into outfile '/tmp/a.txt';
mysql> /tmp/a.txt;

Soln 2)

- Export only structure of a db
- drop the database
- import the .sql of structure 

-- Düzenle ----

earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result

1
Bu sadece ilk tabloyu döndürür gibi görünüyor: TRUNCATE table1 ve diğer tüm tabloları unutur.
Stephen Smith

Bu çözüm kesinlikle delilik olur. neden oy alamadım bilmiyorum. düzenlenmiş olan hatamın yanlışı olabilir.
Angelin Nadar

0

Bu benim için çalıştı. Veritabanı, kullanıcı adı ve parolayı buna göre değiştirin.

mysql -Nse 'show tables' -D DATABASE -uUSER -pPWD | while read table; do echo "SET FOREIGN_KEY_CHECKS = 0;drop table \`$table\`;SET FOREIGN_KEY_CHECKS = 1;"; done | mysql DATABASE -uUSER -pPWD


-1

Bir fikir sadece tabloları bırakmak ve yeniden oluşturmak olabilir mi?

DÜZENLE:

@Jonathan Leffler: Doğru

Diğer Öneri (veya TÜM tabloları kısaltmanız gerekmediği durumda):

Neden yalnızca belirli tabloları kısaltmak için temel bir saklı yordam oluşturmuyorsunuz?

CREATE PROCEDURE [dbo].[proc_TruncateTables]
AS
TRUNCATE TABLE Table1
TRUNCATE TABLE Table2
TRUNCATE TABLE Table3
GO

Bu, tablolardaki tüm kısıtlamaları, izinleri, görünümleri vb. Kaybeder - bu önemli bir sıkıntıdır.
Jonathan Leffler

Bir silme yapabilir, ardından kesme yerine tüm tabloları yeniden çekebilirsiniz. İşaretin hayal kırıklığı olmadığını varsayıyorum. Sadece yedeklemenizi geri yükleyin.
Mark Redman

-5
<?php
// connect to database
$conn=mysqli_connect("localhost","user","password","database");

// check connection
if (mysqli_connect_errno()) {
  exit('Connect failed: '. mysqli_connect_error());
}

// sql query
$sql =mysqli_query($conn,"TRUNCATE " . TABLE_NAME);


// Print message
if ($sql === TRUE) {
  echo 'data delete successfully';
}
else {
 echo 'Error: '. $conn->error;
}

$conn->close();

?>

İşte bir tablo temizlemek için kullandığınız kod snippet'i. $ Conn bilgisini ve TABLE_NAME öğesini değiştirmeniz yeterli.


hey james, ben OP öncelikle bir astar .... ve ikincisi tüm tablolar bir kez kapalı almak ve onları silmek için bir komut arıyor düşünüyorum. bu bir çeşit kullanıcı müdahalesini gerektirir. yazı için teşekkürler
Craig Wayne
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.