MySQL ลบแถวทั้งหมดออกจากตารางและรีเซ็ต ID เป็นศูนย์


183

ฉันต้องลบแถวทั้งหมดออกจากตาราง แต่เมื่อฉันเพิ่มแถวใหม่ฉันต้องการรหัสคีย์หลักซึ่งมีการเพิ่มอัตโนมัติเพื่อเริ่มต้นอีกครั้งจาก 0 ตามลำดับจาก 1

คำตอบ:


304

อย่าลบใช้ตัดทอน:

Truncate table XXX

ตัวจัดการตารางไม่จดจำค่า AUTO_INCREMENT ที่ใช้ล่าสุด แต่เริ่มนับจากจุดเริ่มต้น สิ่งนี้เป็นจริงแม้สำหรับ MyISAM และ InnoDB ซึ่งโดยปกติแล้วจะไม่นำค่าลำดับมาใช้ซ้ำ

แหล่ง


20
Truncate ทำงานได้ดีกับตารางที่ไม่มีข้อ จำกัด แต่หากตารางของคุณมีข้อ จำกัด Foreign Key คุณอาจลองใช้วิธีการลบ ดูโพสต์นี้หากคุณมีข้อ จำกัด FK: ตัดทอนข้อ จำกัด คีย์ที่ต่างประเทศ
Julian Soro

1
โปรดจำไว้ว่าตารางการตัดปลายจะไม่ย้อนกลับ
penny chan

83

หากคุณไม่สามารถใช้TRUNCATE(เช่นเนื่องจากข้อ จำกัด กุญแจต่างประเทศ) คุณสามารถใช้ตารางแก้ไขหลังจากลบแถวทั้งหมดเพื่อเริ่มต้น auto_increment ใหม่:

ALTER TABLE mytable AUTO_INCREMENT = 1

3
@NBhargav เนื่องจากคุณอาจใช้เอ็นจิ้น InnoDB บนโต๊ะแทน MyISAM คนแรกไม่รองรับการรีเซ็ตดัชนี
Gustavo Rubio

วิธีการลบแถวทั้งหมดก่อนที่จะเปลี่ยนค่า auto_increment
Kasun Siyambalapitiya

@KasunSiyambalapitiya DELETE FROM tablename;(แต่นั่นจะไม่ทำงานได้ดีเมื่อมีข้อ จำกัด FK - ดูstackoverflow.com/a/5452798/507761 )
Matthew อ่าน

17

หากตารางมีคีย์ต่างประเทศฉันจะใช้รหัสต่อไปนี้เสมอ:

SET FOREIGN_KEY_CHECKS = 0; -- disable a foreign keys check
SET AUTOCOMMIT = 0; -- disable autocommit
START TRANSACTION; -- begin transaction

/*
DELETE FROM table_name;
ALTER TABLE table_name AUTO_INCREMENT = 1;
-- or
TRUNCATE table_name;
-- or
DROP TABLE table_name;
CREATE TABLE table_name ( ... );
*/

SET FOREIGN_KEY_CHECKS = 1; -- enable a foreign keys check
COMMIT;  -- make a commit
SET AUTOCOMMIT = 1 ;

แต่ความแตกต่างจะอยู่ในเวลาดำเนินการ ดูคำตอบของโซรินข้างต้น


2
นี่เป็นวิธีที่ดีในการมีข้อมูลเด็กกำพร้าในตารางใด ๆ ที่คีย์ต่างประเทศเข้าสู่ตารางที่คุณกำลังเช็ดออก การเปิดใช้งานการตรวจสอบคีย์ต่างประเทศหลังจากข้อเท็จจริงไม่ได้ทำให้ MySQL ทำการตรวจสอบความถูกต้องของคีย์ต่างประเทศใหม่เท่าที่ฉันทราบ สิ่งนี้ทำให้คุณมีแถวที่มีข้อมูลที่ไม่มีอยู่ในตารางอ้างอิง คุณอาจรวมทั้งไม่ได้มีปุ่มต่างประเทศบนโต๊ะของคุณที่ทั้งหมด
cimmanon

8

ข้อเท็จจริงที่น่าสนใจ

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

ดังนั้นฉันขอแนะนำให้ลองทั้งสองอย่างดูว่าอะไรทำงานได้เร็วขึ้นสำหรับกรณีของคุณ


2

หากคุณต้องการtruncateใช้สิ่งนี้:

SET FOREIGN_KEY_CHECKS = 0; 
TRUNCATE table $table_name; 
SET FOREIGN_KEY_CHECKS = 1;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.