Příkaz MySQL TRUNCATE TABLE je příkaz DDL používaný k odstranění všech záznamů z tabulky MySQL. Když spustíme tento příkaz, nejprve zruší existující tabulku a poté vytvoří novou tabulku pomocí definice tabulky. Sekvence provádění dotazu příkazu TRUNCATE TABLE je DROP TABLE a CREATE TABLE.
Charakteristiky příkazu TRUNCATE TABLE jsou následující:
- Když místo mazání řádků spustíme příkaz TRUNCATE TABLE, MySQL tabulku zruší a znovu ji vytvoří. Je rychlejší než příkaz DELETE, zejména u velkých tabulek.
- TRUNCATE TABLE obchází spouštěče DELETE, aby bylo dosaženo vysokého výkonu.
- TRUNCATE TABLE nelze vrátit zpět, protože způsobuje implicitní potvrzení.
- Pokud používáte atomové úložiště s podporou DDL a server se během operací TRUNCATE TABLE zastaví, transakce budou plně potvrzeny nebo vráceny zpět.
- Obnoví hodnoty sloupců AUTO_INCREAMENT na počáteční hodnotu.
- Příkaz TRUNCATE TABLE selže, pokud jste vytvořili cizí klíče v tabulkách InnoDB nebo NDB.
- I když jsou tabulka nebo index poškozeny a definice tabulky je platná, příkaz TRUNCATE TABLE znovu vytvoří prázdnou tabulku.
- Příkaz TRUNCATE TABLE zachovává rozdělení. Indexové soubory a data budou odstraněny, ale definice oddílu nebude ovlivněna.
- Poškozenou tabulku InnoDB můžete zkrátit.
- Pokud používáte tabulkový prostor file-per-table, příkaz TRUNCATE TABLE zruší tabulkový prostor a vytvoří nový.
- V souhrnných tabulkách schématu výkonu můžeme použít TRUNCATE TABLE, ale nesmaže data z tabulek. Obnoví hodnoty souhrnného sloupce na NULL nebo Zero (0).
Rozdíly mezi příkazy tabulky DELETE a TRUNCATE
Sr. | DELETE Statement | Příkaz TRUNCATE TABLE |
1 | Příkaz DELETE je příkaz DML. Změny se zaznamenávají do binárních protokolů databáze. | Příkaz TRUNCATE TABLE je příkaz DDL. Operace není protokolována v binárních protokolech. |
2 | Operaci lze vrátit zpět. | Tuto operaci nelze vrátit zpět. |
3 | Je pomalejší, protože změny se zaznamenávají do binárních protokolů a spouštějí se spouštěče DML. | Je rychlejší, protože zruší stávající tabulku a vytvoří novou. |
4 | Příkaz DELETE získá zámek na úrovni řádku. | TRUNCATE TABLE uzamkne datové stránky před odstraněním dat. |
5 | Konkrétní záznamy můžete odstranit pomocí klauzule WHERE | Zkrátit tabulku odstraní všechna data z tabulky. |
Používání příkazu TRUNCATE TABLE v praxi
Syntaxe příkazu Truncate Table je následující:
TRUNCATE TABLE [DatabaseName].[TABLE_NAME]
Poznámka:Název tabulky, ze které chcete záznam odstranit, je za ZKRÁTIT TABULKU prohlášení. Předpokládejme, že chcete zkrátit tblStudent stůl. Dotaz by měl být následující:
TRUNCATE TABLE tblStudent
Pro ukázku jsem nainstaloval MySQL 8.0 Server a vytvořil databázi s názvem studentsDB . Tam jsem vytvořil tabulky s názvem tblStudent , tblSchool, a tblStudentCounsiler.
Následující skript vytvoří databázi a tabulky:
Create database studentDB;
CREATE TABLE studentDB.tblstudent (
studentID integer NOT NULL AUTO_INCREMENT,
StudentName varchar(255) DEFAULT NULL,
StudentGrade char(1) DEFAULT NULL,
SchoolID int,
PRIMARY KEY (studentID)
)
ENGINE = INNODB;
CREATE TABLE studentDB.tblschool (
SchoolID int NOT NULL AUTO_INCREMENT,
SchoolName varchar(255) DEFAULT '',
City varchar(255) DEFAULT '',
PRIMARY KEY (SchoolID)
)
ENGINE = INNODB;
CREATE TABLE studentDB.tblStudentCounsiler (
CounsilerID int NOT NULL AUTO_INCREMENT,
CounsilerName varchar(255) DEFAULT '',
PRIMARY KEY (CounsilerID)
)
ENGINE = INNODB;
Vytvořil jsem cizí klíč na tblStudent tabulka, která odkazuje na SchoolID sloupec tblStudent tabulka.
Skript pro vytvoření cizího klíče je následující:
ALTER TABLE studentDB.tblstudent
ADD CONSTRAINT FK_tblstudent_SchoolID FOREIGN KEY (SchoolID)
REFERENCES studentDB.tblschool (SchoolID) ON DELETE NO ACTION;
ER diagram je níže:
Následující skript vloží sečtená data do všech tabulek:
Use studentDB;
insert INTO tblSchool(SchoolName,City) VALUES ('Nalanda School','Mehsana');
insert INTO tblSchool(SchoolName,City) VALUES ('Sarvajanik School','Mehsana');
insert INTO tblSchool(SchoolName,City) VALUES ('Diwan Ballubhai','Ahmedabad');
INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Nisarg Upadhyay','A',1);
INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Nirali Upadhyay','A',2);
INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Manushi Upadhyay','C',3);
INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Dixit Upadhyay','B',1);
INSERT INTO tblstudent (StudentName,StudentGrade,SchoolID) VALUES ('Bharti Upadhyay','A',1);
INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Raghav Dave');
INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Keyur Dalwadi');
INSERT INTO tblStudentCounsiler (CounsilerName) VALUES ('Sawan Panchal');
Nyní pochopíme případy použití.
Nejprve zkrátíme tblStudentCounsiler s následujícím dotazem:
mysql> truncate table studentdb.tblStudentCounsiler;
Výstup :
Query OK, 0 rows affected (0.08 sec)
Spuštěním příkazu SELECT zobrazte data:
mysql> select * from studentdb.tblStudentCounsiler;
Výstup dotazu:
Empty set (0.01 sec)
Jak můžete vidět na snímku obrazovky výše, příkaz byl úspěšně proveden.
Nyní zkusme zkrátit tblSchool tabulka s následujícím dotazem:
mysql> Truncate table tblSchool;
K následující chybě dochází, protože nelze zkrátit tabulku, na kterou odkazuje jiná tabulka:
ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`studentdb`.`tblstudent`, CONSTRAINT `FK_tblstudent_SchoolID`)
Abychom tuto chybu opravili, musíme cizí klíč zahodit. Chcete-li to provést, spusťte následující dotaz:
mysql> ALTER TABLE tblstudent DROP FOREIGN KEY FK_tblstudent_SchoolID;
Výstup dotazu:
Query OK, 0 rows affected (0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0
Po zahození cizího klíče spusťte příkaz trunce table:
mysql> Truncate table tblSchool;
Výstup dotazu:
Query OK, 0 rows affected (0.08 sec)
Shrnutí
Aktuální článek představil příkaz TRUNCATE TABLE a jeho vlastnosti. Seznámili jsme se s rozdíly mezi příkazy TRUNCATE TABLE a DELETE a také jsme prozkoumali několik praktických příkladů k objasnění pojmů.