ตัดตารางทั้งหมดในฐานข้อมูล MySQL ด้วยคำสั่งเดียวหรือไม่?


347

มีแบบสอบถาม (คำสั่ง) เพื่อตัดตารางทั้งหมดในฐานข้อมูลในการดำเนินการครั้งเดียวหรือไม่? ฉันต้องการทราบว่าฉันสามารถทำได้ด้วยแบบสอบถามเดียวหรือไม่


1
ตัดทอนตารางทั้งหมดหรือไม่ คุณหมายถึงการตัดคอลัมน์ทั้งหมดของตารางทั้งหมดในฐานข้อมูลหรือไม่? นี่คือภาษาของแบบสอบถามใด (เช่น SQL, MySQL, Oracle, Postgres และอื่น ๆ )
Jay

ฉันไม่แน่ใจว่าฉันจะแนะนำให้ทำเช่นนี้เพราะคุณสามารถได้รับปัญหา มีเหตุผลที่คุณไม่สามารถสคริปต์ตัดทอนและเรียกใช้สคริปต์หรือไม่
GrayWizardx

ขอบคุณ 4 ตอบ แต่เหตุผลเดียวที่ไม่ได้เขียนสคริปต์มีการทำงานสั้นของเวลาคิดว่าดังนั้นของ runnind แบบสอบถามใน MySQL
Devang

ยาใน mysql..and แบบสอบถามหมายถึงสิ่งที่คล้ายกับตารางตัด table_name..here ฉันต้องการที่จะตัดทุกแถวของตารางทั้งหมดในฐานข้อมูลของฉันในแบบสอบถามหนึ่ง
Devang

คุณสามารถใช้ Information_Schema ด้วยเคอร์เซอร์ ไม่แน่ใจเกี่ยวกับ MySql แต่ควรรองรับ Information_Schema.Tables
GrayWizardx

คำตอบ:


340

วาง (เช่นลบตาราง)

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

17
ใช่สะอาดไท แต่คุณอาจต้องรันด้วย -uUSER -pPASSWORD นอกจากนี้คุณอาจต้องเรียกใช้หลายครั้งหากคุณมี FK โดยไม่ต้องลบทิ้ง
mihaicc

47
หากคุณพบปัญหา FK เช่น " ไม่สามารถลบหรืออัปเดตแถวพาเรนต์: ข้อ จำกัด ของรหัสต่างประเทศล้มเหลว " โปรดปิดใช้งานการตรวจสอบคีย์ต่างประเทศโดยแก้ไขคำสั่งดังนี้:mysql -e "SET FOREIGN_KEY_CHECKS = 0; drop table $table" DATABASE_NAME
Ethan P.

24
ไม่จำเป็นต้องวนลูปไคลเอนต์ mysql นำออกจากวงเช่นนี้:mysql -Nse 'show tables' DATABASE_NAME | while read table; do echo "drop table $table;"; done | mysql DATABASE_NAME
Alexander Shcheblikin

2
@TylerCollier คุณต้องการ. my.cnf
Felix Eve

2
จากคำตอบและความคิดเห็นข้างต้นและเนื่องจากพวกเขาใช้งานไม่ได้ตามที่คาดไว้ฉันจึงสร้างสคริปต์ทุบตีง่ายๆที่คุณสามารถใช้ได้ คุณสามารถค้นหาได้ที่: gist.github.com/mocanuga/eff26a3dcc40ef657a1c812f68511f6d
mocanuga

145

ตัดทอนฐานข้อมูลหลายตารางในอินสแตนซ์ 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;

1
นี่อาจเป็นทางออกที่ดีที่สุดหากคุณมีผู้ใช้และรหัสผ่านสำหรับฐานข้อมูลของคุณและคุณไม่ต้องการที่จะพิมพ์พวกเขาอย่างชัดเจนในเปลือกของคุณ
Bach

5
Upvoted เนื่องจากโซลูชันนี้ต้องการการเข้าถึงฐานข้อมูลเท่านั้นไม่ใช่การเข้าถึง SSH นอกจากนี้มันเป็นอิสระจากระบบปฏิบัติการ
mastazi

@astazi ฉันมีคำถามสองสามข้อ: 1. table_schema "คืออะไร มันยืนจากชื่อสคีมาหรือไม่ 2. สิ่งที่ TABLE_NAME หมายถึง? มันยืนสำหรับตารางที่ควรจะลบหรือไม่ 3. ฉันควรเขียนตารางที่ควรจะลบคำสั่งเช่น "('db1_name', 'db2_name') หรือไม่
AAEM

@Ahmed การทดแทนที่จำเป็นเท่านั้นคือคุณต้องแทนที่ db1_name และ db2_name ด้วยชื่อของฐานข้อมูลของคุณ จากนั้นคุณต้องคัดลอกผลลัพธ์ของแบบสอบถามนี้และวางเป็นแบบสอบถาม mysql ใหม่และดำเนินการ Information_SCHEMA เป็น schema ในตัวที่ติดตั้งมาล่วงหน้าในการติดตั้ง MySQL ทุกครั้งและเก็บข้อมูลเกี่ยวกับฐานข้อมูลของคุณอย่าแตะต้องมิฉะนั้น MySQL ของคุณจะเริ่มทำงานผิดปกติ :-) table_schema และ table_name เป็นคอลัมน์ของตารางที่เรียกว่า "TABLES" ภายใน information_schema
mastazi

โดย "db_name" คุณหมายถึงชื่อของ schema หรือไม่ ฉันมี 1 schema เท่านั้นที่ฉันต้องการลบข้อมูลในตาราง
AAEM

67

ใช้ phpMyAdmin ด้วยวิธีนี้:

มุมมองฐานข้อมูล => เลือกทั้งหมด (ตาราง) => ว่าง

หากคุณต้องการเพิกเฉยต่อการตรวจสอบคีย์ต่างประเทศคุณสามารถยกเลิกการเลือกช่องที่ระบุว่า:

[] เปิดใช้งานการตรวจสอบคีย์ต่างประเทศ

คุณจะต้องทำงานอย่างน้อยเวอร์ชัน 4.5.0 หรือสูงกว่าเพื่อรับช่องทำเครื่องหมายนี้

มันไม่ใช่ MySQL CLI-fu, แต่เดี๋ยวก่อน, มันใช้ได้!


31
ใครบอกว่าเราใช้ PHP ...
jsh

37
ใครบอกว่าเราไม่ได้ทำ คำตอบนี้เห็นได้ชัดว่าเป็นประโยชน์ต่อผู้คน; มันช่วย.
bzeaman

2
สิ่งนี้จะไม่ทำงานหากคุณมีสคีมาฐานข้อมูลรอง - ลูก
นิวเคลียส Bondoc

2
ข้อ จำกัด คีย์ต่างประเทศล้มเหลว
Brian Hannay

2
@BrianHannay มันถูกเพิ่มเข้ามาใน PMA 4.5.0 ในเดือนมิถุนายน 2558 ฉันพบการ เปลี่ยนแปลงและปัญหาดั้งเดิม
Nemo

24

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

hi..thanks สำหรับ d ตอบฉันพยายามแบบสอบถามนี้ แต่ดูเหมือนจะไม่ work..is เดอร์บางอย่างเช่นตัดตาราง table_name ที่ฉันสามารถใช้สำหรับตารางทั้งหมดในฐานข้อมูลของฉัน ..
Devang

ฉันลืมว่า MySQL ไม่รองรับตัวดำเนินการ "+" โดยตรง สมมติว่าเป็นข้อผิดพลาดฉันเพิ่มตัวอย่าง CONCAT () ด้านบน หากคุณยังคงได้รับข้อความแสดงข้อผิดพลาดโปรดแบ่งปันข้อความแสดงข้อผิดพลาดจริง
ชายหาด

แบบสอบถามนี้ใช้งานได้ แต่ถ้าฉันมีชื่อ diff db เช่น devang .. เป็นชื่อ db ของฉันดังนั้นถ้าฉันใช้ตามแบบสอบถามด้านบนของคุณจะพ่นข้อผิดพลาด foll .. ตาราง 'devang.TABLES' ไม่มีอยู่จริง
devang

3
อ่า INFORMATION_SCHEMA เป็นมุมมองที่มีอยู่ในฐานข้อมูลที่ใช้งานอยู่ หากคุณเปลี่ยนฐานข้อมูลมุมมองจะถูกดำเนินการกับฐานข้อมูลนั้น ไม่จำเป็นต้องแก้ไขแบบสอบถามเมื่อเปลี่ยนฐานข้อมูล เพียงทำตามขั้นตอนเหล่านี้: 1) เปลี่ยนฐานข้อมูลที่ใช้งานอยู่ 2) เรียกใช้สคริปต์ 3) คัดลอกผลลัพธ์ 4) วางผลลัพธ์กลับเข้าไปในตัวแก้ไข 5) เรียกใช้ผลลัพธ์ ตารางทั้งหมดในฐานข้อมูลที่ใช้งานอยู่จะถูกตัดทอน
ชายหาด

1
ระวัง! นี่เป็นการเลือกตารางทั้งหมดในฐานข้อมูลทั้งหมด (แม้แต่ตารางที่ไม่ได้อยู่ในฐานข้อมูลปัจจุบัน) ตัวอย่าง MySQL ไม่ทำงาน แต่ในกรณีของฉันมันคืนแถว 293 แถว (ตาราง) แทนที่จะเป็น 66 ลองนึกภาพการสูญเสียข้อมูล ...
f4der

19

ฉันพบสิ่งนี้เพื่อวางตารางทั้งหมดในฐานข้อมูล:

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

ทำงานได้สำหรับฉัน - แก้ไขแก้ไขการพิมพ์ผิดในคำสั่งสุดท้าย


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;

หากคุณต้องการทำงานกับฐานข้อมูลปัจจุบัน (และทำให้รหัสนี้พกพาได้) ให้เปลี่ยนเงื่อนไขล่าสุดSELECTเป็น:AND table_schema = DATABASE();
alx

มันไม่ตัดทอนสำหรับฉัน MySQL 5.7.25
Lucas Bustamante

14

ฉันพบว่ามันง่ายที่สุดที่จะทำอะไรเช่นรหัสด้านล่างเพียงแค่แทนที่ชื่อตารางด้วยของคุณเอง สำคัญตรวจสอบให้แน่ใจว่าบรรทัดสุดท้ายอยู่เสมอ 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
คุณไม่ต้องทำซ้ำ SET FOREIGN_KEY_CHECKS = 0; หลังจากคำสั่ง TRUNCATE ทุกครั้งที่บรรทัดเริ่มต้นซึ่งจะทำเครื่องหมายโหมดเป็น 0
HMagdy

12

นี่จะพิมพ์คำสั่งเพื่อตัดทอนตารางทั้งหมด:

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

5
  1. ในการตัดทอนตารางเราจะต้องวางข้อ จำกัด foreign key ลงในคอลัมน์ในตารางนี้จากตารางอื่น (อันที่จริงแล้วในทุกตารางใน DB / Schema ที่ระบุ)
  2. ดังนั้นข้อ จำกัด ที่สำคัญต่างประเทศทั้งหมดจะต้องลดลงในขั้นต้นตามด้วยการตัดตาราง
  3. อีกทางเลือกหนึ่งคือใช้ตารางการปรับให้เหมาะสม (ใน mysql, innodb engine esp) เพื่อเรียกคืนพื้นที่ข้อมูล / ขนาดที่ใช้ไปยังระบบปฏิบัติการหลังจากการตัดทอนข้อมูล
  4. เมื่อตัดข้อมูลออกแล้วให้สร้างข้อ จำกัด 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' ในชื่อข้อ จำกัด


3

ถ้าใช้ 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]

คู่มือการใช้งาน mysqldump จาก dev.mysql


3

ใช้สิ่งนี้และสร้างแบบสอบถาม

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


ชื่อ db ควรเป็น qoutes
Roman M


2

นี่คือตัวแปรของฉันที่จะมี 'หนึ่งคำสั่งให้ตัด' 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');

ซึ่งตอนนี้คือหนึ่งคำสั่ง :-)


2

ที่นี่เพื่อฉันรู้ที่นี่

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

    }
?>

ตรวจสอบรายละเอียดที่นี่ ลิงค์


1

นี่คือขั้นตอนที่ควรตัดทอนตารางทั้งหมดในฐานข้อมูลท้องถิ่น

แจ้งให้เราทราบหากไม่ได้ผลและฉันจะลบคำตอบนี้

ยังไม่ทดลอง

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;

ใช้เวลามากกับฉันในการหาสาเหตุว่าทำไมสิ่งนี้ถึงไม่ทำงาน .. จากนั้นความคิดเห็นในเธรดอีเมลนี้ช่วย: forums.mysql.com/read.php?61,116597,219343#msg-219343 - สำหรับการอ้างอิง : "น่าเสียดายดูเหมือนว่าการเตรียมงบไม่สามารถใช้เป็นเคอร์เซอร์ได้จากคู่มือ: dev.mysql.com/doc/refman/6.0/en/… "
Tominator

1

ฉันพบว่า 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'''

0

ฉันไม่แน่ใจ แต่ฉันคิดว่ามีคำสั่งเดียวที่ใช้ซึ่งคุณสามารถคัดลอกสคีมาของฐานข้อมูลลงในฐานข้อมูลใหม่เมื่อคุณทำสิ่งนี้แล้วคุณสามารถลบฐานข้อมูลเก่าและหลังจากนี้คุณสามารถคัดลอกสคีมาฐานข้อมูลไปยังชื่อเดิมได้อีก


1
mysqldump -uuser -ppassword - no-data salesLeadsBrittany> salesLeadsTemplate.sql สิ่งนี้จะสร้างไฟล์ sql ที่มีสคีมาเท่านั้น (ไม่มีข้อมูล) คุณสามารถลบฐานข้อมูลหลังจากคำสั่งนี้และสามารถสร้างฐานข้อมูลโดยการนำเข้าสคีมา
GJ

0

ฉันรู้ว่านี่ไม่ใช่คำสั่งเดียว แต่ผลลัพธ์ที่ต้องการสามารถทำได้จากภายใน phpMyAdmin โดยทำตามขั้นตอนเหล่านี้:

  1. เลือกตาราง (ทั้งหมด) ที่จะลบ (เลือกทั้งหมด)
  2. เลือก "วาง" / "ตัดปลาย" จากรายการ "พร้อมเลือก:"
  3. ในหน้าการยืนยัน ("คุณต้องการ:") คัดลอกแบบสอบถาม (ทุกอย่างที่มีพื้นหลังสีแดง)
  4. ไปที่ด้านบนและคลิกที่ SQL และเขียน: "SET FOREIGN_KEY_CHECKS = 0;" จากนั้นวางแบบสอบถามที่คัดลอกไว้ก่อนหน้า
  5. คลิก "ไป"

แนวคิดคือรับตารางทั้งหมดอย่างรวดเร็วจากฐานข้อมูล (ซึ่งคุณทำใน 5 วินาทีและ 2 คลิก) แต่ปิดใช้งานการตรวจสอบคีย์ต่างประเทศก่อน ไม่มี CLI และไม่ปล่อยฐานข้อมูลและเพิ่มอีกครั้ง


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

-

ดาวิด

ขอบคุณที่สละเวลาในการจัดรูปแบบโค้ด แต่นี่เป็นวิธีที่ควรนำไปใช้

-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"
  1. Approval_external_system ขึ้นอยู่กับ Approval_request
  2. ที่อยู่ขึ้นอยู่กับลูกค้า
  3. customer_identification ขึ้นอยู่กับลูกค้า
  4. external_id ขึ้นอยู่กับลูกค้า
  5. หนังสือรับรองขึ้นอยู่กับลูกค้า
  6. email_address ขึ้นอยู่กับลูกค้า
  7. Approval_request ขึ้นอยู่กับลูกค้า
  8. customer_status ขึ้นอยู่กับลูกค้า
  9. customer_image ขึ้นอยู่กับลูกค้า

แสดงรายการตารางและจำนวนแถว:

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
  1. ตัดทอนที่อยู่ตาราง
  2. การตัดทอนการอนุมัติตาราง _external_system
  3. การตัดทอนการอนุมัติตาราง _request
  4. ตัดทอนตารางประเทศ
  5. การตัดหนังสือรับรองตาราง
  6. ตัดลูกค้าตาราง
  7. ตัดทอน customer_identification ของตาราง
  8. ตัดทอนตาราง customer_image
  9. ตัดทอนตาราง customer_status

ตรวจสอบว่ามันใช้งานได้:

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

0

แบบสอบถาม 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


0

โซล 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

1
ดูเหมือนว่าจะส่งคืนตารางแรกเท่านั้น: TRUNCATE table1 และลืมเกี่ยวกับตารางอื่นทั้งหมด
Stephen Smith

การแก้ปัญหานี้จะบ้าอย่างแน่นอน ฉันไม่รู้ว่าทำไมมันไม่ได้รับการโหวต อาจเป็นเพราะความผิดพลาดของฉันซึ่งได้รับการแก้ไข
Angelin Nadar

0

สิ่งนี้ใช้ได้สำหรับฉัน เปลี่ยนฐานข้อมูลชื่อผู้ใช้และรหัสผ่านให้สอดคล้อง

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

ความคิดอาจเป็นเพียงแค่วางและสร้างตารางใหม่

แก้ไข:

@ Jonathan Leffler: จริง

คำแนะนำอื่น ๆ (หรือกรณีที่คุณไม่จำเป็นต้องตัดทอนตารางทั้งหมด):

ทำไมไม่เพียงสร้างขั้นตอนการจัดเก็บพื้นฐานเพื่อตัดตารางเฉพาะ

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

นั่นจะสูญเสียข้อ จำกัด สิทธิ์มุมมองและอื่น ๆ ทั้งหมดบนตารางซึ่งเป็นสิ่งที่สร้างความรำคาญใจอย่างมาก
Jonathan Leffler

คุณสามารถทำการลบจากนั้นทำการ reseed ตารางทั้งหมดแทนการตัดทอน ฉันคิดว่าเครื่องหมายถูกออกจากแห้ว เพียงกู้คืนข้อมูลสำรองของคุณ
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();

?>

นี่คือข้อมูลโค้ดที่ฉันใช้ล้างตาราง เพียงแค่เปลี่ยนข้อมูล $ conn และ TABLE_NAME


เฮ้เจมส์ฉันคิดว่า OP กำลังมองหาหนึ่งซับ .... และคำสั่งที่สองที่จะได้รับตารางทั้งหมดในครั้งเดียวและลบออก สิ่งนี้ต้องการการแทรกแซงจากผู้ใช้บางประเภท ขอบคุณสำหรับการโพสต์แม้ว่า
Craig Wayne
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.