Apakah ada cara mudah yang bagus untuk menjatuhkan semua tabel dari database MySQL, mengabaikan batasan kunci asing yang mungkin ada di sana?
Drop
dari menu dropdown, Anda dapat menghapus Foreign key check
centang pada kotak centang.
Apakah ada cara mudah yang bagus untuk menjatuhkan semua tabel dari database MySQL, mengabaikan batasan kunci asing yang mungkin ada di sana?
Drop
dari menu dropdown, Anda dapat menghapus Foreign key check
centang pada kotak centang.
Jawaban:
Saya menemukan set pernyataan drop yang dihasilkan berguna, dan merekomendasikan tweak ini:
SELECT concat('DROP TABLE IF EXISTS `', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'MyDatabaseName';
Catatan 1: Ini tidak menjalankan pernyataan DROP, itu hanya memberi Anda daftar mereka. Anda perlu memotong dan menempelkan output ke mesin SQL Anda untuk menjalankannya.
Catatan 2: Jika Anda memiliki LIHAT, Anda harus memperbaiki setiap DROP TABLE `VIEW_NAME`
pernyataan DROP VIEW `VIEW_NAME`
secara manual.
"RESTRICT dan CASCADE diizinkan untuk membuat porting lebih mudah. Di MySQL 5.5, mereka tidak melakukan apa-apa."
Oleh karena itu, agar pernyataan drop berfungsi jika Anda membutuhkan:
SET FOREIGN_KEY_CHECKS = 0
Ini akan menonaktifkan pemeriksaan integritas referensial - jadi ketika Anda selesai melakukan tetesan yang Anda butuhkan, Anda ingin mengatur ulang pemeriksaan kunci
SET FOREIGN_KEY_CHECKS = 1
SET FOREIGN_KEY_CHECKS = 0;
-- Your semicolon separated list of DROP statements here
SET FOREIGN_KEY_CHECKS = 1;
NB: untuk menggunakan output SELECT lebih mudah, opsi mysql -B dapat membantu.
DROP DATABASE foo; CREATE DATABASE foo;
, yang tidak sama tetapi bekerja untuk saya.
Dari http://www.devdaily.com/blog/post/mysql/drop-mysql-tables-in-any-order-foreign-keys :
SET FOREIGN_KEY_CHECKS = 0;
drop table if exists customers;
drop table if exists orders;
drop table if exists order_details;
SET FOREIGN_KEY_CHECKS = 1;
(Perhatikan bahwa ini menjawab cara menonaktifkan pemeriksaan kunci asing agar dapat menjatuhkan tabel dalam urutan sewenang-wenang. Itu tidak menjawab bagaimana secara otomatis menghasilkan pernyataan drop-table untuk semua tabel yang ada dan menjalankannya dalam satu skrip. Jawaban Jean tidak.)
Inilah prosedur tersimpan SurlyDre yang dimodifikasi sehingga kunci asing diabaikan:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
_tableName
dengan backquotes. Kalau tidak, itu akan gagal pada beberapa tabel seperti group
atau kata kunci lainnya.
setiap pendekatan di atas mencakup lebih banyak pekerjaan daripada yang AFAICT ini ...
( mysqldump --add-drop-table --no-data -u root -p database | grep 'DROP TABLE' ) > ./drop_all_tables.sql
mysql -u root -p database < ./drop_all_tables.sql
mysqldump
ke mysql
, tanpa melalui file?
mysqldump
ke grep
dalam mysql
, ia bekerja. Sekali lagi terima kasih atas solusinya, itu bagus.
Dari jawaban ini ,
menjalankan:
use `dbName`; --your db name here
SET FOREIGN_KEY_CHECKS = 0;
SET @tables = NULL;
SET GROUP_CONCAT_MAX_LEN=32768;
SELECT GROUP_CONCAT('`', table_schema, '`.`', table_name, '`') INTO @tables
FROM information_schema.tables
WHERE table_schema = (SELECT DATABASE());
SELECT IFNULL(@tables, '') INTO @tables;
SET @tables = CONCAT('DROP TABLE IF EXISTS ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1;
Ini menjatuhkan tabel dari database yang sedang digunakan. Anda dapat mengatur basis data saat ini menggunakan use
.
Atau sebaliknya, jawaban yang diterima Dion lebih sederhana, kecuali Anda perlu menjalankannya dua kali, pertama untuk mendapatkan kueri, dan kedua untuk menjalankan kueri. Saya memberikan beberapa tanda centang konyol untuk melarikan diri karakter khusus dalam nama db dan tabel.
SELECT CONCAT('DROP TABLE IF EXISTS `', table_schema, '`.`', table_name, '`;')
FROM information_schema.tables
WHERE table_schema = 'dbName'; --your db name here
Inilah solusi berbasis kursor. Agak panjang tetapi berfungsi sebagai kumpulan SQL tunggal:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql = CONCAT('DROP TABLE ', _tableName);
PREPARE stmt1 FROM @stmt_sql;
EXECUTE stmt1;
DEALLOCATE PREPARE stmt1;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
Anda dapat melakukan:
select concat('drop table if exists ', table_name, ' cascade;')
from information_schema.tables;
Kemudian jalankan kueri yang dihasilkan. Mereka akan menjatuhkan setiap tabel pada database saat ini.
Berikut ini beberapa bantuan pada drop table
perintah.
||
diatur untuk menjadi operator gabungan. Lebih khusus lagi, mode MySQL SQL berisi PIPES_AS_CONCAT
. Referensi: dev.mysql.com/doc/refman/5.0/en/…
concat
sebagai ganti||
Saya datang dengan modifikasi ini pada jawaban Dion Truter untuk membuatnya lebih mudah dengan banyak tabel:
SET GROUP_CONCAT_MAX_LEN = 10000000;
SELECT CONCAT('SET FOREIGN_KEY_CHECKS=0;\n',
GROUP_CONCAT(CONCAT('DROP TABLE IF EXISTS `', table_name, '`')
SEPARATOR ';\n'),
';\nSET FOREIGN_KEY_CHECKS=1;')
FROM information_schema.tables
WHERE table_schema = 'SchemaName';
Ini mengembalikan semuanya dalam satu bidang, sehingga Anda bisa menyalin satu kali dan menghapus semua tabel (gunakan Copy Field Content (unquoted)
di Workbench). Jika Anda memiliki BANYAK tabel, Anda dapat mencapai batas tertentu GROUP_CONCAT()
. Jika demikian, tambah variabel maks len (dan max_allowed_packet
, jika perlu).
Satu liner untuk menjatuhkan semua tabel dari database yang diberikan:
echo "DATABASE_NAME"| xargs -I{} sh -c "mysql -Nse 'show tables' {}| xargs -I[] mysql -e 'SET FOREIGN_KEY_CHECKS=0; drop table []' {}"
Menjalankan ini akan menjatuhkan semua tabel dari database DATABASE_NAME.
Dan hal yang menyenangkan tentang ini adalah bahwa nama database hanya ditulis secara eksplisit satu kali.
Googling pada topik selalu membawa saya ke pertanyaan SO ini jadi di sini berfungsi kode mysql yang menghapus KEDUA tabel dan tampilan:
DROP PROCEDURE IF EXISTS `drop_all_tables`;
DELIMITER $$
CREATE PROCEDURE `drop_all_tables`()
BEGIN
DECLARE _done INT DEFAULT FALSE;
DECLARE _tableName VARCHAR(255);
DECLARE _cursor CURSOR FOR
SELECT table_name
FROM information_schema.TABLES
WHERE table_schema = SCHEMA();
DECLARE CONTINUE HANDLER FOR NOT FOUND SET _done = TRUE;
SET FOREIGN_KEY_CHECKS = 0;
OPEN _cursor;
REPEAT FETCH _cursor INTO _tableName;
IF NOT _done THEN
SET @stmt_sql1 = CONCAT('DROP TABLE IF EXISTS ', _tableName);
SET @stmt_sql2 = CONCAT('DROP VIEW IF EXISTS ', _tableName);
PREPARE stmt1 FROM @stmt_sql1;
PREPARE stmt2 FROM @stmt_sql2;
EXECUTE stmt1;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt1;
DEALLOCATE PREPARE stmt2;
END IF;
UNTIL _done END REPEAT;
CLOSE _cursor;
SET FOREIGN_KEY_CHECKS = 1;
END$$
DELIMITER ;
call drop_all_tables();
DROP PROCEDURE IF EXISTS `drop_all_tables`;
Berikut adalah cara otomatis untuk melakukan ini melalui skrip bash:
host=$1
dbName=$2
user=$3
password=$4
if [ -z "$1" ]
then
host="localhost"
fi
# drop all the tables in the database
for i in `mysql -h$host -u$user -p$password $dbName -e "show tables" | grep -v Tables_in` ; do echo $i && mysql -h$host -u$user -p$password $dbName -e "SET FOREIGN_KEY_CHECKS = 0; drop table $i ; SET FOREIGN_KEY_CHECKS = 1" ; done
Jika di linux (atau sistem lain yang mendukung perpipaan, gema dan grep) Anda dapat melakukannya dengan satu baris:
echo "SET FOREIGN_KEY_CHECKS = 0;" > temp.txt; \
mysqldump -u[USER] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP >> temp.txt; \
echo "SET FOREIGN_KEY_CHECKS = 1;" >> temp.txt; \
mysql -u[USER] -p[PASSWORD] [DATABASE] < temp.txt;
Saya tahu ini adalah pertanyaan lama, tetapi saya pikir metode ini cepat dan sederhana.
Dalam php semudah:
$pdo = new PDO('mysql:dbname=YOURDB', 'root', 'root');
$pdo->exec('SET FOREIGN_KEY_CHECKS = 0');
$query = "SELECT concat('DROP TABLE IF EXISTS ', table_name, ';')
FROM information_schema.tables
WHERE table_schema = 'YOURDB'";
foreach($pdo->query($query) as $row) {
$pdo->exec($row[0]);
}
$pdo->exec('SET FOREIGN_KEY_CHECKS = 1');
Hanya ingat untuk mengubah YOURDB ke nama database Anda, dan jelas pengguna / pass.
Dalam shell Linux seperti bash / zsh:
DATABASE_TO_EMPTY="your_db_name";
{ echo "SET FOREIGN_KEY_CHECKS = 0;" ; \
mysql "$DATABASE_TO_EMPTY" --skip-column-names -e \
"SELECT concat('DROP TABLE IF EXISTS ', table_name, ';') \
FROM information_schema.tables WHERE table_schema = '$DATABASE_TO_EMPTY';";\
} | mysql "$DATABASE_TO_EMPTY"
Ini akan menghasilkan perintah, lalu segera memipakannya ke instance klien ke-2 yang akan menghapus tabel.
Bit pintar tentu saja disalin dari jawaban lain di sini - Saya hanya ingin copy-dan-paste-liner (ish) untuk benar - benar melakukan pekerjaan yang diinginkan OP.
Catatan tentu saja Anda harus memasukkan kredensial Anda dalam (dua kali) dalam perintah mysql ini, kecuali jika Anda memiliki pengaturan keamanan yang sangat rendah. (Atau Anda bisa alias perintah mysql Anda untuk memasukkan kredit Anda.)
Taruh di sini beberapa komentar berguna yang dibuat oleh Jonathan Watt untuk menjatuhkan semua tabel
MYSQL="mysql -h HOST -u USERNAME -pPASSWORD DB_NAME"
$MYSQL -BNe "show tables" | awk '{print "set foreign_key_checks=0; drop table `" $1 "`;"}' | $MYSQL
unset MYSQL
Ini membantu saya dan saya harap ini bisa bermanfaat
Lepaskan semua tabel dari database dengan satu baris dari baris perintah:
mysqldump -u [user_name] -p[password] -h [host_name] --add-drop-table --no-data [database_name] | grep ^DROP | mysql -u [user_name] -p[password] -h [host_name] [database_name]
Di mana [user_name], [password], [host_name] dan [database_name] harus diganti dengan data nyata (pengguna, kata sandi, nama host, nama database).
Ini adalah posting yang cukup lama, tetapi tidak ada jawaban di sini yang benar-benar menjawab pertanyaan menurut pendapat saya, jadi saya berharap posting saya akan membantu orang!
Saya menemukan solusi ini pada pertanyaan lain yang bekerja sangat baik untuk saya:
mysql -Nse 'show tables' DB_NAME | while read table; do mysql -e "SET FOREIGN_KEY_CHECKS=0; truncate table \`$table\`" DB_NAME; done
Itu benar-benar akan mengosongkan semua tabel Anda di database DB_NAME
, dan tidak hanya menampilkan TRUNCATE
baris perintah.
Semoga ini membantu!
Membangun jawaban oleh @Dion Truter dan @Wade Williams, skrip shell berikut akan menjatuhkan semua tabel, setelah terlebih dahulu menunjukkan apa yang akan dijalankan, dan memberi Anda kesempatan untuk membatalkan menggunakan Ctrl-C.
#!/bin/bash
DB_HOST=xxx
DB_USERNAME=xxx
DB_PASSWORD=xxx
DB_NAME=xxx
CMD="mysql -sN -h ${DB_HOST} -u ${DB_USERNAME} -p${DB_PASSWORD} ${DB_NAME}"
# Generate the drop statements
TMPFILE=/tmp/drop-${RANDOM}.sql
echo 'SET FOREIGN_KEY_CHECKS = 0;' > ${TMPFILE}
${CMD} $@ >> ${TMPFILE} << ENDD
SELECT concat('DROP TABLE IF EXISTS \`', table_name, '\`;')
FROM information_schema.tables
WHERE table_schema = '${DB_NAME}';
ENDD
echo 'SET FOREIGN_KEY_CHECKS = 1;' >> ${TMPFILE}
# Warn what we are about to do
echo
cat ${TMPFILE}
echo
echo "Press ENTER to proceed (or Ctrl-C to abort)."
read
# Run the SQL
echo "Dropping tables..."
${CMD} $@ < ${TMPFILE}
echo "Exit status is ${?}."
rm ${TMPFILE}
Solusi ini didasarkan pada jawaban @SkyLeach tetapi dengan dukungan menjatuhkan tabel dengan kunci asing.
echo "SET FOREIGN_KEY_CHECKS = 0;" > ./drop_all_tables.sql
mysqldump --add-drop-table --no-data -u user -p dbname | grep 'DROP TABLE' >> ./drop_all_tables.sql
echo "SET FOREIGN_KEY_CHECKS = 1;" >> ./drop_all_tables.sql
mysql -u user -p dbname < ./drop_all_tables.sql
DB="your database name" \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=0" \
&& mysqldump --add-drop-table --no-data $DB | grep 'DROP TABLE' | grep -Ev "^$" | mysql $DB \
&& mysql $DB < "SET FOREIGN_KEY_CHECKS=1"
Sederhana dan jelas (mungkin).
Mungkin bukan solusi yang bagus, tetapi ini berhasil dan menyelamatkan hari saya.
Bekerja untuk versi Server: 5.6.38 MySQL Community Server (GPL)
Langkah-langkah yang saya ikuti:
1. generate drop query using concat and group_concat.
2. use database
3. disable key constraint check
4. copy the query generated from step 1
5. enable key constraint check
6. run show table
Shell MySQL
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>
Saya menggunakan yang berikut ini dengan server MSSQL:
if (DB_NAME() = 'YOUR_DATABASE')
begin
while(exists(select 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS where CONSTRAINT_TYPE='FOREIGN KEY'))
begin
declare @sql nvarchar(2000)
SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
FROM information_schema.table_constraints
WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
exec (@sql)
PRINT @sql
end
while(exists(select 1 from INFORMATION_SCHEMA.TABLES))
begin
declare @sql2 nvarchar(2000)
SELECT TOP 1 @sql2=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
FROM INFORMATION_SCHEMA.TABLES
exec (@sql2)
PRINT @sql2
end
end
else
print('Only run this script on the development server!!!!')
Ganti YOUR_DATABASE dengan nama database Anda atau hapus seluruh pernyataan IF (Saya suka keamanan tambahan).
Solusi terbaik untuk saya sejauh ini
Pilih Database -> Klik Kanan -> Tugas -> Buat Skrip - akan membuka panduan untuk membuat skrip. Setelah memilih objek dalam opsi Scripting yang ditetapkan, klik Tombol Lanjut . Di bawah "Script DROP and CREATE" pilih Script DROP .
Jalankan skrip.