มีแบบสอบถาม (คำสั่ง) เพื่อตัดตารางทั้งหมดในฐานข้อมูลในการดำเนินการครั้งเดียวหรือไม่? ฉันต้องการทราบว่าฉันสามารถทำได้ด้วยแบบสอบถามเดียวหรือไม่
มีแบบสอบถาม (คำสั่ง) เพื่อตัดตารางทั้งหมดในฐานข้อมูลในการดำเนินการครั้งเดียวหรือไม่? ฉันต้องการทราบว่าฉันสามารถทำได้ด้วยแบบสอบถามเดียวหรือไม่
คำตอบ:
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
ตัดทอนฐานข้อมูลหลายตารางในอินสแตนซ์ Mysql
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('db1_name','db2_name');
ใช้ผลการสืบค้นเพื่อตัดทอนตาราง
หมายเหตุ: คุณอาจจะได้รับข้อผิดพลาดนี้:
ERROR 1217 (23000): Cannot delete or update a parent row: a foreign key constraint fails
ที่เกิดขึ้นหากมีตารางที่มีรหัสต่างประเทศอ้างอิงถึงตารางที่คุณพยายามวาง / ตัด
ก่อนที่จะตัดทอนตารางสิ่งที่คุณต้องทำคือ:
SET FOREIGN_KEY_CHECKS=0;
ตัดทอนตารางของคุณและเปลี่ยนกลับเป็น
SET FOREIGN_KEY_CHECKS=1;
ใช้ phpMyAdmin ด้วยวิธีนี้:
มุมมองฐานข้อมูล => เลือกทั้งหมด (ตาราง) => ว่าง
หากคุณต้องการเพิกเฉยต่อการตรวจสอบคีย์ต่างประเทศคุณสามารถยกเลิกการเลือกช่องที่ระบุว่า:
[] เปิดใช้งานการตรวจสอบคีย์ต่างประเทศ
คุณจะต้องทำงานอย่างน้อยเวอร์ชัน 4.5.0 หรือสูงกว่าเพื่อรับช่องทำเครื่องหมายนี้
มันไม่ใช่ MySQL CLI-fu, แต่เดี๋ยวก่อน, มันใช้ได้!
MS SQL Server 2005+ (ลบ PRINT สำหรับการดำเนินการจริง ... )
EXEC sp_MSforeachtable 'PRINT ''TRUNCATE TABLE ?'''
หากแพลตฟอร์มฐานข้อมูลของคุณรองรับมุมมอง INFORMATION_SCHEMA ให้นำผลลัพธ์ของแบบสอบถามต่อไปนี้มาใช้และเรียกใช้งาน
SELECT 'TRUNCATE TABLE ' + TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
ลองใช้สิ่งนี้สำหรับ MySQL:
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES
การเพิ่มเครื่องหมายอัฒภาคใน Concat ทำให้ง่ายต่อการใช้เช่นจากภายใน mysql workbench
SELECT Concat('TRUNCATE TABLE ', TABLE_NAME, ';') FROM INFORMATION_SCHEMA.TABLES
ฉันพบสิ่งนี้เพื่อวางตารางทั้งหมดในฐานข้อมูล:
mysqldump -uUSERNAME -pPASSWORD --add-drop-table --no-data DATABASENAME | grep ^DROP | mysql -uUSERNAME -pPASSWORD DATABASENAME
มีประโยชน์ถ้าคุณถูก จำกัด ด้วยการโฮสต์โซลูชัน (ไม่สามารถปล่อยฐานข้อมูลทั้งหมด)
ฉันแก้ไขมันเพื่อตัดทอนตาราง ไม่มี "- เพิ่ม -truncate-table" สำหรับ mysqldump ดังนั้นฉัน:
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
ทำงานได้สำหรับฉัน - แก้ไขแก้ไขการพิมพ์ผิดในคำสั่งสุดท้าย
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
เป็น:AND table_schema = DATABASE();
ฉันพบว่ามันง่ายที่สุดที่จะทำอะไรเช่นรหัสด้านล่างเพียงแค่แทนที่ชื่อตารางด้วยของคุณเอง สำคัญตรวจสอบให้แน่ใจว่าบรรทัดสุดท้ายอยู่เสมอ 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 GROUP_CONCAT(Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME) SEPARATOR ';') FROM INFORMATION_SCHEMA.TABLES where table_schema in ('my_db');
เมื่อตัดข้อมูลออกแล้วให้สร้างข้อ จำกัด foreign key ที่เหมือนกันอีกครั้งในตารางเดียวกัน ดูสคริปต์ด้านล่างที่จะสร้างสคริปต์เพื่อดำเนินการด้านบน
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';
ตอนนี้ให้รันสคริปต์ Db Truncate.sql ที่สร้างขึ้น
ประโยชน์ที่ได้รับ 1) เรียกคืนพื้นที่ว่างในดิสก์ 2) ไม่ต้องการวางและสร้าง DB / Schema ด้วยโครงสร้างเดียวกัน
ข้อเสีย 1) ข้อ จำกัด FK ควรเป็นชื่อในตารางที่มีชื่อที่มี 'FK' ในชื่อข้อ จำกัด
ถ้าใช้ sql server 2005 จะมีโพรซีเดอร์ที่เก็บซ่อนอยู่ซึ่งอนุญาตให้คุณรันคำสั่งหรือชุดคำสั่งกับตารางทั้งหมดภายในฐานข้อมูล นี่คือวิธีที่คุณจะโทรTRUNCATE TABLE
ด้วยโพรซีเดอร์ที่เก็บไว้นี้:
EXEC [sp_MSforeachtable] @command1="TRUNCATE TABLE ?"
นี่คือบทความที่ดีที่อธิบายเพิ่มเติม
อย่างไรก็ตามสำหรับ MySql คุณสามารถใช้ mysqldump และระบุ--add-drop-tables
และ--no-data
ตัวเลือกเพื่อวางและสร้างตารางทั้งหมดโดยไม่สนใจข้อมูล แบบนี้:
mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE]
ใช้สิ่งนี้และสร้างแบบสอบถาม
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in (db1,db2)
INTO OUTFILE '/path/to/file.sql';
ตอนนี้ใช้สิ่งนี้เพื่อใช้แบบสอบถามนี้
mysql -u username -p </path/to/file.sql
ถ้าคุณได้รับข้อผิดพลาดเช่นนี้
ERROR 1701 (42000) at line 3: Cannot truncate a table referenced in a foreign key constraint
วิธีที่ง่ายที่สุดในการค้นหาคือที่ด้านบนสุดของไฟล์ของคุณเพิ่มบรรทัดนี้
SET FOREIGN_KEY_CHECKS=0;
ซึ่งบอกว่าเราไม่ต้องการตรวจสอบข้อ จำกัด กุญแจต่างประเทศในขณะที่อ่านไฟล์นี้
มันจะตัดทอนตารางทั้งหมดในฐานข้อมูล db1 และ bd2
ไม่ไม่มีคำสั่งเดียวที่จะตัดตาราง mysql ทั้งหมดในครั้งเดียว คุณจะต้องสร้างสคริปต์ขนาดเล็กเพื่อตัดทอนตารางทีละรายการ
ref: http://dev.mysql.com/doc/refman/5.0/en/truncate-table.html
นี่คือตัวแปรของฉันที่จะมี 'หนึ่งคำสั่งให้ตัด' em all '
ก่อนอื่นฉันใช้ฐานข้อมูลแยกต่างหากชื่อ 'util' สำหรับขั้นตอนการจัดเก็บผู้ช่วยของฉัน รหัสของขั้นตอนการจัดเก็บของฉันที่จะตัดทอนตารางทั้งหมดคือ:
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 ;
เมื่อคุณมีขั้นตอนนี้เก็บไว้ในฐานข้อมูล util ของคุณคุณสามารถเรียกมันว่า
call util.trunctables('nameofdatabase');
ซึ่งตอนนี้คือหนึ่งคำสั่ง :-)
ที่นี่เพื่อฉันรู้ที่นี่
SELECT Concat('TRUNCATE TABLE ',table_schema,'.',TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.TABLES where table_schema in ('databasename1','databasename2');
หากไม่สามารถลบหรืออัพเดตแถวพาเรนต์: ข้อ จำกัด รหัสต่างประเทศล้มเหลว
ที่เกิดขึ้นหากมีตารางที่มีรหัสต่างประเทศอ้างอิงถึงตารางที่คุณพยายามวาง / ตัด
ก่อนที่จะตัดทอนตารางสิ่งที่คุณต้องทำคือ:
SET FOREIGN_KEY_CHECKS=0;
ตัดทอนตารางของคุณและเปลี่ยนกลับเป็น
SET FOREIGN_KEY_CHECKS=1;
ใช้รหัส php นี้
$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']);
}
?>
ตรวจสอบรายละเอียดที่นี่ ลิงค์
นี่คือขั้นตอนที่ควรตัดทอนตารางทั้งหมดในฐานข้อมูลท้องถิ่น
แจ้งให้เราทราบหากไม่ได้ผลและฉันจะลบคำตอบนี้
ยังไม่ทดลอง
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;
ฉันพบว่า TRUNCATE Table .. มีปัญหากับข้อ จำกัด ของ foreign key แม้หลังจาก NOCHECK CONSTRAINT ALL ทั้งหมดดังนั้นฉันจึงใช้คำสั่ง DELETE FROM แทน นี่หมายความว่าเมล็ดข้อมูลประจำตัวไม่ได้ถูกรีเซ็ตคุณสามารถเพิ่ม DBCC CHECKIDENT เพื่อให้ได้สิ่งนี้เสมอ
ฉันใช้รหัสด้านล่างเพื่อพิมพ์ออกไปยังหน้าต่างข้อความ sql สำหรับการตัดทอนตารางทั้งหมดในฐานข้อมูลก่อนที่จะรัน มันแค่ทำให้ยากขึ้นนิดหน่อยในการทำผิด
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'''
ฉันไม่แน่ใจ แต่ฉันคิดว่ามีคำสั่งเดียวที่ใช้ซึ่งคุณสามารถคัดลอกสคีมาของฐานข้อมูลลงในฐานข้อมูลใหม่เมื่อคุณทำสิ่งนี้แล้วคุณสามารถลบฐานข้อมูลเก่าและหลังจากนี้คุณสามารถคัดลอกสคีมาฐานข้อมูลไปยังชื่อเดิมได้อีก
ฉันรู้ว่านี่ไม่ใช่คำสั่งเดียว แต่ผลลัพธ์ที่ต้องการสามารถทำได้จากภายใน phpMyAdmin โดยทำตามขั้นตอนเหล่านี้:
แนวคิดคือรับตารางทั้งหมดอย่างรวดเร็วจากฐานข้อมูล (ซึ่งคุณทำใน 5 วินาทีและ 2 คลิก) แต่ปิดใช้งานการตรวจสอบคีย์ต่างประเทศก่อน ไม่มี CLI และไม่ปล่อยฐานข้อมูลและเพิ่มอีกครั้ง
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
-
ดาวิด
ขอบคุณที่สละเวลาในการจัดรูปแบบโค้ด แต่นี่เป็นวิธีที่ควรนำไปใช้
-Kurt
บนกล่อง UNIX หรือ Linux:
ตรวจสอบให้แน่ใจว่าคุณอยู่ใน bash shell คำสั่งเหล่านี้จะถูกเรียกใช้จากบรรทัดคำสั่งดังต่อไปนี้
บันทึก:
ฉันเก็บข้อมูลประจำตัวของฉันไว้ในไฟล์ ~ / .my.cnf ของฉันดังนั้นฉันไม่จำเป็นต้องระบุมันลงในบรรทัดคำสั่ง
บันทึก:
cpm เป็นชื่อฐานข้อมูล
ฉันแสดงตัวอย่างผลลัพธ์เพียงเล็กน้อยจากแต่ละคำสั่ง
ค้นหาข้อ จำกัด กุญแจต่างประเทศของคุณ:
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"
แสดงรายการตารางและจำนวนแถว:
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
ตัดทอนตารางของคุณ:
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
ตรวจสอบว่ามันใช้งานได้:
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:
บันทึก:
cpm เป็นชื่อฐานข้อมูล
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
แบบสอบถาม MySQL ต่อไปนี้จะสร้างแบบสอบถามเดียวที่จะตัดตารางทั้งหมดในฐานข้อมูลที่กำหนด มันข้ามคีย์ต่างประเทศ:
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
mysqldump -u root -p --no-data dbname > schema.sql
mysqldump -u root -p drop dbname
mysqldump -u root -p < schema.sql
โซล 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;
โซลน์ 2)
- Export only structure of a db
- drop the database
- import the .sql of structure
- แก้ไข ----
earlier in solution 1, i had mentioned concat() instead of group_concat() which would have not returned the desired result
สิ่งนี้ใช้ได้สำหรับฉัน เปลี่ยนฐานข้อมูลชื่อผู้ใช้และรหัสผ่านให้สอดคล้อง
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
ความคิดอาจเป็นเพียงแค่วางและสร้างตารางใหม่
แก้ไข:
@ Jonathan Leffler: จริง
คำแนะนำอื่น ๆ (หรือกรณีที่คุณไม่จำเป็นต้องตัดทอนตารางทั้งหมด):
ทำไมไม่เพียงสร้างขั้นตอนการจัดเก็บพื้นฐานเพื่อตัดตารางเฉพาะ
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();
?>
นี่คือข้อมูลโค้ดที่ฉันใช้ล้างตาราง เพียงแค่เปลี่ยนข้อมูล $ conn และ TABLE_NAME