Apakah ada query (perintah) untuk memotong semua tabel dalam sebuah database dalam satu operasi? Aku ingin tahu apakah aku bisa melakukan ini dengan satu permintaan.
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "drop table $table" DATABASE_NAME; done
mysql -Nse 'show tables' DATABASE_NAME | while read table; do mysql -e "truncate table $table" DATABASE_NAME; done
memotong beberapa tabel database pada Mysql misalnya
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
Menggunakan Hasil Query untuk memotong tabel
Catatan: mungkin anda akan mendapatkan error ini:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
Itu terjadi jika ada tabel dengan kunci asing referensi ke meja anda mencoba untuk drop/truncate.
Sebelum memotong tabel Semua yang perlu anda lakukan adalah:
SET FOREIGN_KEY_CHECKS=0;
Memotong tabel anda dan mengubahnya kembali ke
SET FOREIGN_KEY_CHECKS=1;
Menggunakan phpMyAdmin dengan cara ini:
View Database => Cek Semua (tabel) => Kosong
Jika anda ingin mengabaikan kunci asing cek, anda dapat hapus centang kotak yang mengatakan:
[ ] Mengaktifkan foreign key pemeriksaan
Anda'll harus berjalan minimal versi 4.5.0 atau lebih tinggi untuk mendapatkan kotak centang ini.
Tidak CLI MySQL-fu, tapi hey, it works!
MS SQL Server 2005+ (Hapus CETAK untuk eksekusi yang sebenarnya...)
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
Jika database anda platform yang mendukung INFORMATION_SCHEMA pandangan, mengambil hasil query berikut dan mengeksekusi mereka.
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
Coba ini untuk MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
Menambahkan tanda titik koma Concat membuatnya lebih mudah untuk digunakan misalnya dari dalam mysql workbench.
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
Saya menemukan ini untuk drop 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 mampu untuk menjatuhkan seluruh database).
Saya diubah untuk memotong meja. Tidak ada "--add-memotong-meja" 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
bekerja untuk saya --edit, memperbaiki kesalahan ketik pada perintah terakhir
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;
Saya menemukan hal yang paling sederhana untuk hanya melakukan sesuatu seperti kode di bawah ini, hanya mengganti 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;
SELECT CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.',TABLE_NAME,' DROP FOREIGN KEY ',CONSTRAINT_NAME,';') DARI INFORMATION_SCHEMA.TABLE_CONSTRAINTS
Di MANA CONSTRAINT_TYPE='FOREIGN KEY' DAN TABLE_SCHEMA=' Sekarang, jalankan Db Truncate.script sql yang dihasilkan Manfaat. Kelemahan.
Penggunaan ini dan membentuk query
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 menggunakan ini untuk menggunakan query ini
mysql -u username -p </path/to/file.sql
jika anda mendapatkan error seperti ini
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
cara termudah untuk pergi melalui ini di bagian atas file anda tambahkan baris ini
SET FOREIGN_KEY_CHECKS=0;
yang mengatakan bahwa kita don't ingin memeriksa constraint foreign key sementara akan melalui file ini.
Itu akan memotong semua tabel dalam database db1 dan bd2.
jika menggunakan sql server 2005, ada yang tersembunyi disimpan prosedur yang memungkinkan anda untuk mengeksekusi sebuah perintah atau satu set perintah terhadap semua tabel dalam database. Berikut adalah bagaimana anda sebut TRUNCATE TABLE
dengan prosedur ini disimpan:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
Di sini adalah sebuah artikel yang menjelaskan lebih lanjut.
Untuk MySql, namun, anda bisa menggunakan mysqldump dan menentukan --add-drop-tabel
dan yang-tidak-data
pilihan untuk menjatuhkan dan membuat semua tabel mengabaikan data. seperti ini:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
Berikut adalah varian untuk memiliki 'satu pernyataan untuk memotong 'em'.
Pertama, saya menggunakan database yang terpisah bernama 'util' bagi saya penolong disimpan prosedur. Kode saya disimpan prosedur 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 ini disimpan di util database, anda dapat menyebutnya seperti
call util.trunctables('nameofdatabase');
yang sekarang tepat satu pernyataan :-)
di sini karena aku tahu 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 update a parent row: a foreign key constraint fails
Itu terjadi jika ada tabel dengan kunci asing referensi ke meja anda mencoba untuk drop/truncate.
Sebelum memotong tabel Semua yang perlu anda lakukan adalah:
SET FOREIGN_KEY_CHECKS=0;
Memotong tabel anda dan mengubahnya kembali ke
SET FOREIGN_KEY_CHECKS=1;
pengguna ini kode php <?php mysql_connect("localhost","root",''); mysql_select_db("restoran");
$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']);
}
?>
cek detail di sini link
Saya menemukan bahwa TRUNCATE TABLE .. memiliki masalah dengan pembatas kunci asing, bahkan setelah NOCHECK KENDALA SEMUA, jadi saya menggunakan MENGHAPUS DARI pernyataan sebaliknya. Ini tidak berarti bahwa identitas benih yang tidak me-reset, anda selalu bisa menambahkan DBCC CHECKIDENT untuk mencapai hal ini.
Saya Menggunakan kode berikut untuk mencetak pesan jendela sql untuk menghapus semua tabel dalam database, sebelum menjalankan itu. Itu hanya membuatnya 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'''
Berikut adalah prosedur yang harus memotong semua tabel dalam database lokal.
Biarkan aku tahu jika itu doesn't bekerja dan I'll menghapus jawaban ini.
Belum teruji
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;
Ini bekerja untuk saya. Perubahan database, username dan password yang sesuai.
mysql -Nse 'lihat tabel' -D DATABASE -pengguna -pPWD | saat membaca tabel; echo "SET FOREIGN_KEY_CHECKS = 0;drop table \
$tabel`;SET FOREIGN_KEY_CHECKS = 1;"; dilakukan | mysql DATABASE -pengguna -pPWD`
Saya tidak yakin tapi saya pikir ada satu perintah menggunakan yang anda dapat menyalin skema database ke database baru, setelah anda melakukan ini, anda dapat menghapus database lama dan setelah ini anda dapat lagi copy skema database dengan nama lama.
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
Aku tahu ini isn't tepat satu perintah, tapi hasil yang diinginkan dapat dicapai dari dalam phpMyAdmin dengan mengikuti langkah berikut:
Idenya adalah untuk cepat mendapatkan semua tabel dari database (yang anda lakukan dalam 5 detik dan 2 klik) tapi menonaktifkan kunci asing pemeriksaan pertama. Tidak ada CLI dan tidak menjatuhkan database dan menambahkan lagi.