ฉันต้องลบแถวทั้งหมดออกจากตาราง แต่เมื่อฉันเพิ่มแถวใหม่ฉันต้องการรหัสคีย์หลักซึ่งมีการเพิ่มอัตโนมัติเพื่อเริ่มต้นอีกครั้งจาก 0 ตามลำดับจาก 1
ฉันต้องลบแถวทั้งหมดออกจากตาราง แต่เมื่อฉันเพิ่มแถวใหม่ฉันต้องการรหัสคีย์หลักซึ่งมีการเพิ่มอัตโนมัติเพื่อเริ่มต้นอีกครั้งจาก 0 ตามลำดับจาก 1
คำตอบ:
อย่าลบใช้ตัดทอน:
Truncate table XXX
ตัวจัดการตารางไม่จดจำค่า AUTO_INCREMENT ที่ใช้ล่าสุด แต่เริ่มนับจากจุดเริ่มต้น สิ่งนี้เป็นจริงแม้สำหรับ MyISAM และ InnoDB ซึ่งโดยปกติแล้วจะไม่นำค่าลำดับมาใช้ซ้ำ
หากคุณไม่สามารถใช้TRUNCATE
(เช่นเนื่องจากข้อ จำกัด กุญแจต่างประเทศ) คุณสามารถใช้ตารางแก้ไขหลังจากลบแถวทั้งหมดเพื่อเริ่มต้น auto_increment ใหม่:
ALTER TABLE mytable AUTO_INCREMENT = 1
DELETE FROM tablename;
(แต่นั่นจะไม่ทำงานได้ดีเมื่อมีข้อ จำกัด FK - ดูstackoverflow.com/a/5452798/507761 )
หากตารางมีคีย์ต่างประเทศฉันจะใช้รหัสต่อไปนี้เสมอ:
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 ;
แต่ความแตกต่างจะอยู่ในเวลาดำเนินการ ดูคำตอบของโซรินข้างต้น
ข้อเท็จจริงที่น่าสนใจ
ผมแน่ใจว่าTRUNCATE
จะทำงานได้ดีขึ้น แต่ในกรณีของฉันสำหรับฐานข้อมูลที่มีประมาณ 30 ตารางด้วยปุ่มต่างประเทศมีประชากรที่มีเพียงไม่กี่แถวก็ใช้เวลาประมาณ 12 วินาทีเพื่อTRUNCATE
ตารางทั้งหมดเมื่อเทียบกับเพียงไม่กี่ร้อยมิลลิวินาทีในการDELETE
แถว การตั้งค่าการเพิ่มอัตโนมัติจะเพิ่มประมาณวินาทีโดยรวม แต่ก็ยังดีกว่ามาก
ดังนั้นฉันขอแนะนำให้ลองทั้งสองอย่างดูว่าอะไรทำงานได้เร็วขึ้นสำหรับกรณีของคุณ
หากคุณต้องการtruncate
ใช้สิ่งนี้:
SET FOREIGN_KEY_CHECKS = 0;
TRUNCATE table $table_name;
SET FOREIGN_KEY_CHECKS = 1;