Pangkas semua tabel dalam database MySQL dalam satu perintah?


346

Apakah ada permintaan (perintah) untuk memotong semua tabel dalam database dalam satu operasi? Saya ingin tahu apakah saya bisa melakukan ini dengan satu permintaan tunggal.


1
Pangkas semua tabel? maksud Anda memotong semua kolom dari semua tabel dalam database? Dalam bahasa query apa ini? (misalnya SQL, MySQL, Oracle, Postgres, dll)
Jay

Saya tidak yakin saya akan merekomendasikan melakukan ini karena Anda dapat dengan mudah membuat diri Anda kesulitan. Apakah ada alasan mengapa Anda tidak bisa hanya skrip truncate dan menjalankan skrip?
GrayWizardx

thanks 4 jawaban tapi hanya alasan untuk tidak scripting itu berjalan singkat jadi berpikir dari runnind query di mysql
Devang

ya di mysql..and query berarti sesuatu yang mirip dengan truncate table table_name..di sini saya ingin memotong semua baris dari semua tabel di db saya dalam satu permintaan
devang

Anda dapat menggunakan Information_Schema dengan kursor. Tidak yakin tentang MySql, tetapi harus mendukung Information_Schema.Tables
GrayWizardx

Jawaban:


340

Jatuhkan (mis. Hapus tabel)

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

Potong (yaitu tabel kosong)

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

17
Yup, bersih, ty. Tetapi Anda mungkin perlu menjalankan ini dengan -UUSER -pPASSWORD. Anda juga mungkin harus menjalankannya beberapa kali jika Anda memiliki FK tanpa Anda hapus pada kaskade.
mihaicc

47
Jika Anda mengalami masalah FK seperti " Tidak dapat menghapus atau memperbarui baris induk: batasan kunci asing gagal ", pastikan untuk menonaktifkan pemeriksaan kunci asing dengan memodifikasi perintah sebagai berikut:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.

24
Tidak perlu untuk mengulang klien mysql. Keluarkan dari lingkaran seperti ini:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Alexander Shcheblikin

2
@TylerCollier Anda memerlukan .my.cnf
Felix Eve

2
Berdasarkan jawaban dan komentar di atas, dan karena mereka tidak bekerja seperti yang diharapkan untuk saya, saya membuat skrip bash sederhana yang dapat Anda gunakan untuk ini. Anda dapat menemukannya di: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

memotong beberapa tabel database pada instance Mysql

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

Gunakan Hasil Permintaan untuk memotong tabel

Catatan: mungkin Anda akan mendapatkan kesalahan ini:

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

Itu terjadi jika ada tabel dengan referensi kunci asing ke tabel yang Anda coba jatuhkan / potong.

Sebelum memotong tabel Yang perlu Anda lakukan adalah:

SET FOREIGN_KEY_CHECKS=0;

Pangkas tabel Anda dan ubah kembali ke

SET FOREIGN_KEY_CHECKS=1;

1
Ini mungkin solusi terbaik jika Anda memiliki pengguna dan kata sandi untuk basis data Anda, dan Anda tidak ingin mengetikkannya di shell Anda.
Bach

5
Terpilih karena solusi ini hanya membutuhkan akses DB dan bukan akses SSH. Selain itu OS-independen.
mastazi

@ masazi saya punya beberapa pertanyaan: 1. apa artinya "table_schema"? apakah itu berdiri dari nama skema? 2. untuk apa TABLE_NAME berdiri? apakah itu berdiri untuk tabel yang harus dihapus? 3. haruskah saya menulis tinggi tabel yang harus dihapus dengan perintah seperti "('db1_name', 'db2_name')"?
AAEM

@Ahmed, satu-satunya pengganti yang diperlukan adalah Anda harus mengganti db1_name dan db2_name dengan nama-nama basis data Anda. Kemudian Anda harus menyalin hasil kueri ini, dan menempelkannya sebagai kueri mysql baru dan menjalankannya. INFORMATION_SCHEMA adalah skema built-in yang datang pra-instal di setiap instalasi MySQL dan menyimpan informasi tentang database Anda, jangan sentuh itu atau MySQL Anda akan mulai melakukan kesalahan :-) table_schema dan table_name adalah kolom dari tabel yang disebut "TABLES" di dalam information_schema
mastazi

dengan "db_name", maksud Anda nama skema? saya hanya memiliki 1 skema yang ingin saya hapus data
tabelnya

67

Gunakan phpMyAdmin dengan cara ini:

Tampilan Database => Periksa Semua (tabel) => Kosong

Jika Anda ingin mengabaikan pemeriksaan kunci asing, Anda dapat menghapus centang pada kotak yang mengatakan:

[] Aktifkan pemeriksaan kunci asing

Anda harus menjalankan minimal versi 4.5.0 atau lebih tinggi untuk mendapatkan kotak centang ini.

Ini bukan MySQL CLI-fu, tapi hei, itu berhasil!


31
siapa bilang kita menjalankan PHP ...?
jsh

37
Siapa bilang kita tidak? Jawaban ini ternyata terbukti bermanfaat bagi orang; itu membantu.
bzeaman

2
Ini tidak akan berfungsi jika Anda memiliki skema database orangtua-anak.
Cary Bondoc

2
Kendala kunci asing gagal.
Brian Hannay

2
@BrianHannay Itu ditambahkan dalam PMA 4.5.0 pada Juni 2015. Saya menemukan changelog dan masalah aslinya
Nemo

24

MS SQL Server 2005+ (Hapus PRINT untuk eksekusi aktual ...)

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

Jika platform basis data Anda mendukung tampilan INFORMATION_SCHEMA, ambil hasil dari kueri berikut dan jalankan.

SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

Coba ini untuk MySQL:

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

Menambahkan titik koma ke Concat membuatnya lebih mudah untuk digunakan misalnya dari dalam workbench mysql.

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

hi..thanks untuk d balas saya mencoba query ini tapi doesnt tampaknya work..is der sesuatu seperti truncate table table_name yang saya dapat digunakan untuk semua tabel di db saya ..
Devang

Saya lupa bahwa MySQL tidak mendukung operator "+" secara langsung. Dengan asumsi itu adalah kesalahan, saya menambahkan contoh CONCAT () di atas. Jika Anda masih menerima pesan kesalahan, silakan bagikan pesan kesalahan yang sebenarnya.
pantai

kueri ini berfungsi tetapi bagaimana jika saya memiliki nama diff db misalnya devang..adalah nama db saya jadi jika saya menggunakannya sesuai dengan permintaan Anda di atas melempar kesalahan follower .. Tabel 'devang.TABLES' tidak ada
devang

3
Ahh. INFORMATION_SCHEMA adalah tampilan yang ada di database aktif. Jika Anda mengubah database Anda, tampilan kemudian akan dieksekusi terhadap DB itu. Tidak perlu mengubah kueri saat mengubah database. Cukup ikuti langkah-langkah ini: 1) mengubah database aktif. 2) jalankan skrip. 3) salin hasilnya 4) rekatkan hasilnya kembali ke editor 5) jalankan hasilnya. Semua tabel dalam database aktif sekarang terpotong.
pantai

1
WASPADALAH! Ini memilih semua tabel dalam semua database (bahkan yang TIDAK dalam database saat ini. Contoh MySQL tidak berfungsi, tetapi dalam kasus saya ini mengembalikan 293 baris (tabel) alih-alih 66. Bayangkan kehilangan data ...
f4der

19

Saya menemukan ini untuk menjatuhkan semua tabel dalam database:

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

Berguna jika Anda dibatasi oleh solusi hosting (tidak dapat menjatuhkan seluruh database).

Saya memodifikasinya untuk memotong tabel. Tidak ada "--add-truncate-table" untuk mysqldump, jadi saya lakukan:

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

berfungsi untuk saya --edit, memperbaiki kesalahan ketik pada perintah terakhir


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;

Jika Anda ingin bekerja dengan database saat ini (dan dengan demikian membuat kode ini portabel), ubah syarat terakhir SELECTmenjadi ini:AND table_schema = DATABASE();
alx

Itu tidak memotong bagi saya. MySQL 5.7.25
Lucas Bustamante

14

Saya merasa paling mudah untuk hanya melakukan sesuatu seperti kode di bawah ini, cukup ganti nama tabel dengan Anda sendiri. penting pastikan baris terakhir selalu SET FOREIGN_KEY_CHECKS = 1;

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
Anda tidak perlu mengulangi SET FOREIGN_KEY_CHECKS = 0; setelah setiap perintah TRUNCATE tepat di garis start yang akan menandai mode sebagai 0
HMagdy

12

Ini akan mencetak perintah untuk memotong semua tabel:

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

5
  1. Untuk memotong tabel, kita harus membuang batasan kunci asing yang dipetakan ke kolom dalam tabel ini dari tabel lain (pada kenyataannya semua tabel dalam DB / Skema tertentu).
  2. Jadi, semua batasan kunci asing harus diturunkan pada awalnya diikuti oleh pemotongan tabel.
  3. Secara opsional, gunakan tabel optimisasi (dalam mysql, mesin innodb esp) untuk mengklaim kembali ruang / ukuran data yang digunakan untuk OS setelah pemotongan data.
  4. Setelah pemotongan data dilakukan, buat batasan kunci asing yang sama lagi di tabel yang sama. Lihat di bawah ini sebuah skrip yang akan menghasilkan skrip untuk melakukan operasi di atas.

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

Sekarang, jalankan skrip Db Truncate.sql yang dihasilkan

Manfaat. 1) Mengembalikan ruang disk 2) Tidak perlu menjatuhkan dan membuat ulang DB / Skema dengan struktur yang sama

Kekurangannya 1) Kendala FK harus berupa nama dalam tabel dengan nama yang mengandung 'FK' dalam nama kendala.


3

jika menggunakan sql server 2005, ada prosedur tersimpan tersembunyi yang memungkinkan Anda untuk mengeksekusi perintah atau serangkaian perintah terhadap semua tabel di dalam database. Inilah cara Anda akan memanggil TRUNCATE TABLEdengan prosedur tersimpan ini:

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

Berikut adalah artikel bagus yang menguraikan lebih jauh.

Namun, untuk MySql, Anda bisa menggunakan mysqldump dan menentukan opsi --add-drop-tablesdan --no-datauntuk menjatuhkan dan membuat semua tabel mengabaikan data. seperti ini:

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

panduan penggunaan mysqldump dari dev.mysql


3

Gunakan ini dan bentuk kueri

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

Sekarang gunakan ini untuk menggunakan kueri ini

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

jika Anda mendapatkan kesalahan seperti ini

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

cara termudah untuk pergi adalah di bagian atas file Anda tambahkan baris ini

SET FOREIGN_KEY_CHECKS=0;

yang mengatakan bahwa kami tidak ingin memeriksa batasan kunci asing saat membaca file ini.

Ini akan memotong semua tabel di database db1 dan bd2.


nama db harus dalam qoutes
Roman M


2

Inilah varian saya untuk memiliki 'satu pernyataan untuk memotong' mereka semua '.

Pertama, saya menggunakan database terpisah bernama 'util' untuk prosedur tersimpan pembantu saya. Kode prosedur tersimpan saya untuk memotong semua tabel adalah:

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 ;

Setelah Anda memiliki prosedur tersimpan ini di basis data util Anda, Anda dapat menyebutnya seperti

call util.trunctables('nameofdatabase');

yang sekarang persis satu pernyataan :-)


2

sini untuk saya kenal di sini

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

Jika tidak dapat menghapus atau memperbarui baris induk: batasan kunci asing gagal

Itu terjadi jika ada tabel dengan referensi kunci asing ke tabel yang Anda coba jatuhkan / potong.

Sebelum memotong tabel Yang perlu Anda lakukan adalah:

SET FOREIGN_KEY_CHECKS=0;

Pangkas tabel Anda dan ubah kembali ke

SET FOREIGN_KEY_CHECKS=1; 

gunakan kode php ini

    $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']);

    }
?>

periksa detail di sini tautan


1

Berikut adalah prosedur yang harus memotong semua tabel di database lokal.

Beri tahu saya jika tidak berfungsi dan saya akan menghapus jawaban ini.

Belum dicoba

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;

Butuh banyak waktu untuk mencari tahu mengapa ini tidak berhasil .. Kemudian komentar pada utas email ini membantu: forums.mysql.com/read.php?61,116597,219343#msg-219343 - Untuk referensi : "Sayangnya, sepertinya pernyataan persiapan tidak dapat digunakan dalam kursor. Dari manual: dev.mysql.com/doc/refman/6.0/en/… "
Tominator

1

Saya menemukan bahwa TRUNCATE TABLE .. mengalami masalah dengan batasan kunci asing, bahkan setelah CONSTRAINT NOCHECK ALL, jadi saya menggunakan pernyataan DELETE FROM. Ini berarti bahwa benih identitas tidak disetel ulang, Anda selalu dapat menambahkan CHECKIDENT DBCC untuk mencapai ini.

Saya Gunakan kode di bawah ini untuk mencetak ke jendela pesan, sql untuk memotong semua tabel dalam database, sebelum menjalankannya. Itu hanya membuat sedikit lebih sulit untuk membuat kesalahan.

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

Saya tidak yakin tapi saya pikir ada satu perintah yang digunakan yang dapat Anda salin skema database ke database baru, setelah Anda melakukan ini, Anda dapat menghapus database lama dan setelah ini Anda dapat menyalin skema database lagi ke nama lama.


1
mysqldump -uuser -ppassword --no-data salesLeadsBrittany> salesLeadsTemplate.sql Ini akan membuat file sql dengan skema saja (tanpa data). Anda dapat menghapus basis data setelah perintah ini dan dapat membuat ulang database dengan mengimpor skema.
GJ.

0

Saya tahu ini bukan hanya satu perintah, tetapi hasil yang diinginkan dapat dicapai dari dalam phpMyAdmin dengan mengikuti langkah-langkah ini:

  1. Pilih (semua) tabel yang akan dihapus (Periksa Semua)
  2. Pilih "Drop" / "Truncate" dari daftar "With selected:"
  3. Pada halaman konfirmasi ("Apakah Anda benar-benar ingin:") salin kueri (semuanya dengan latar belakang merah)
  4. Pergi ke atas dan klik pada SQL dan tulis: "SET FOREIGN_KEY_CHECKS = 0;" lalu tempelkan kueri yang sebelumnya disalin
  5. Klik "Pergi"

Idenya adalah untuk dengan cepat mendapatkan semua tabel dari database (yang Anda lakukan dalam 5 detik dan 2 klik) tetapi menonaktifkan pemeriksaan kunci asing terlebih dahulu. Tidak ada CLI dan tidak menjatuhkan database dan menambahkannya lagi.


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,

Terima kasih telah meluangkan waktu untuk memformat kode, tetapi beginilah seharusnya diterapkan.

-Kurt

Pada kotak UNIX atau Linux:

Pastikan Anda berada dalam bash shell. Perintah-perintah ini harus dijalankan, dari baris perintah sebagai berikut.

catatan:

Saya menyimpan kredensial saya di file ~ / .my.cnf saya, jadi saya tidak perlu menyediakannya di baris perintah.

catatan:

cpm adalah nama basis data

Saya hanya menunjukkan sampel kecil dari hasil, dari setiap perintah.

Temukan batasan kunci asing Anda:

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. approval_external_system tergantung pada approval_request
  2. alamat tergantung pada pelanggan
  3. identifikasi pelanggan tergantung pada pelanggan
  4. external_id tergantung pada pelanggan
  5. kredensial tergantung pada pelanggan
  6. email_address tergantung pada pelanggan
  7. approval_request tergantung pada pelanggan
  8. customer_status tergantung pada pelanggan
  9. customer_image tergantung pada pelanggan

Daftar tabel dan jumlah baris:

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

Pangkas tabel Anda:

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. Memotong alamat tabel
  2. Memotong tabel approval_external_system
  3. Memotong tabel approval_request
  4. Negara tabel terpotong
  5. Memotong kredensial tabel
  6. Memotong pelanggan meja
  7. Memotong tabel customer_identification
  8. Memotong tabel customer_image
  9. Memotong tabel customer_status

Verifikasi bahwa itu berhasil:

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

Pada kotak Windows:

CATATAN:

cpm adalah nama basis data

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

Permintaan MySQL berikut ini sendiri akan menghasilkan satu permintaan yang akan memotong semua tabel dalam database yang diberikan. Itu memotong kunci ASING:

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 

- edit ----

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

1
Ini sepertinya hanya mengembalikan tabel pertama: TRUNCATE table1, dan lupa tentang semua tabel lainnya.
Stephen Smith

Solusi ini pasti gila. saya tidak tahu mengapa itu tidak mendapatkan suara. mungkin karena kesalahan saya yang telah diedit.
Angelin Nadar

0

Ini berhasil untuk saya. Ubah basis data, nama pengguna, dan kata sandi yang sesuai.

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

Sebuah ide bisa jadi hanya menjatuhkan dan membuat ulang tabel?

EDIT:

@ Jonathan Leffler: Benar

Saran Lainnya (atau jika Anda tidak perlu memotong SEMUA tabel):

Mengapa tidak membuat prosedur tersimpan dasar untuk memotong tabel tertentu

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

Itu kehilangan semua kendala, izin, pandangan, dll pada tabel - yang merupakan gangguan yang cukup besar.
Jonathan Leffler

Anda bisa menghapus, lalu memasang kembali semua tabel alih-alih terpotong. Saya menganggap tanda turun karena frustrasi. Kembalikan cadangan Anda.
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();

?>

Berikut ini cuplikan kode yang saya gunakan untuk menghapus tabel. Cukup ubah info $ conn dan TABLE_NAME.


hei james, saya pikir OP mencari pertama satu liner .... dan kedua perintah untuk mendapatkan semua tabel sekaligus dan menghapusnya. ini memerlukan semacam intervensi pengguna. terima kasih untuk posnya
Craig Wayne
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.