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.
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.
Jawaban:
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
mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
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;
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!
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
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
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;
SELECT
menjadi ini:AND table_schema = DATABASE();
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;
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');
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.
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 TABLE
dengan 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-tables
dan --no-data
untuk menjatuhkan dan membuat semua tabel mengabaikan data. seperti ini:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
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.
Tidak. Tidak ada perintah tunggal untuk memotong semua tabel mysql sekaligus. Anda harus membuat skrip kecil untuk memotong tabel satu per satu.
ref: http://dev.mysql.com/doc/refman/5.0/id/truncate-table.html
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 :-)
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
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;
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'''
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.
Saya tahu ini bukan hanya satu perintah, tetapi hasil yang diinginkan dapat dicapai dari dalam phpMyAdmin dengan mengikuti langkah-langkah ini:
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.
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"
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
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
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
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
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
<?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.