sql >> Databáze >  >> RDS >> Mysql

Porozumění MySQL TRUNCATE TABLE pomocí praktických příkladů

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í:

  1. 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.
  2. TRUNCATE TABLE obchází spouštěče DELETE, aby bylo dosaženo vysokého výkonu.
  3. TRUNCATE TABLE nelze vrátit zpět, protože způsobuje implicitní potvrzení.
  4. 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.
  5. Obnoví hodnoty sloupců AUTO_INCREAMENT na počáteční hodnotu.
  6. Příkaz TRUNCATE TABLE selže, pokud jste vytvořili cizí klíče v tabulkách InnoDB nebo NDB.
  7. I když jsou tabulka nebo index poškozeny a definice tabulky je platná, příkaz TRUNCATE TABLE znovu vytvoří prázdnou tabulku.
  8. Příkaz TRUNCATE TABLE zachovává rozdělení. Indexové soubory a data budou odstraněny, ale definice oddílu nebude ovlivněna.
  9. Poškozenou tabulku InnoDB můžete zkrátit.
  10. Pokud používáte tabulkový prostor file-per-table, příkaz TRUNCATE TABLE zruší tabulkový prostor a vytvoří nový.
  11. 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ů.


  1. Nejrychlejší způsob, jak spustit stejný dotaz vícekrát na serveru SQL

  2. PostgreSQL přízvuk + vyhledávání bez rozlišení velkých a malých písmen

  3. MySQL, je lepší vložit NULL nebo prázdný řetězec?

  4. Předání pole dotazu pomocí klauzule WHERE