sql >> Databasteknik >  >> RDS >> Mysql

Förstå MySQL TRUNCATE TABLE genom praktiska exempel

MySQL TRUNCATE TABLE-satsen är en DDL-sats som används för att ta bort alla poster från MySQL-tabellen. När vi kör det här kommandot släpper det den befintliga tabellen först och skapar sedan en ny tabell med hjälp av tabelldefinitionen. Frågekörningssekvensen för kommandot TRUNCATE TABLE är DROP TABLE och CREATE TABLE.

Egenskaperna för TRUNCATE TABLE-satsen är följande:

  1. När vi kör TRUNCATE TABLE-satsen istället för att ta bort rader, släpper MySQL tabellen och återskapar den. Det är snabbare än DELETE-satsen, särskilt för stora tabeller.
  2. TRUNCATE TABLE förbigår DELETE-triggarna för att uppnå hög prestanda.
  3. TRUNCATE TABLE kan inte återställas eftersom det orsakar en implicit commit.
  4. Om du använder atomic DDL-stödda lagringsmotorer, och servern stannar under TRUNCATE TABLE-operationerna, kommer transaktionerna att fullgöras eller rullas tillbaka.
  5. Den återställer värdena för AUTO_INCREAMENT-kolumnerna till startvärdet.
  6. TRUNCATE TABLE-satsen misslyckas om du har skapat främmande nycklar på InnoDB- eller NDB-tabeller.
  7. Även om tabellen eller indexet är skadat och tabelldefinitionen är giltig, återskapar TRUNCATE TABLE-satsen en tom tabell.
  8. TRUNCATE TABLE-satsen bevarar partitionering. Indexfilerna och data kommer att tas bort, men partitionsdefinitionen kommer inte att påverkas.
  9. Du kan trunkera en skadad InnoDB-tabell.
  10. Om du använder fil-per-tabell-tabellutrymme, tappar TRUNCATE TABLE-satsen tabellutrymmet och skapar en ny.
  11. Vi kan använda TRUNCATE TABLE i resultatschemasammanfattningstabeller, men det tar inte bort tabellernas data. Den återställer värdena för sammanfattningskolumnen till NULL eller Noll (0).

Skillnader mellan DELETE- och TRUNCATE-tabellsatser

Sr. RADERA uttalande TRUNCATE TABLE Statement
1 DELETE-satsen är en DML-sats. Ändringarna loggas i databasens binära loggar. TRUNCATE TABLE-satsen är en DDL-sats. Operationen loggas inte i de binära loggarna.
2 Åtgärden kan återställas. Denna operation kan inte återställas.
3 Det är långsammare eftersom ändringar loggas i de binära loggarna, DML-utlösare exekveras. Det är snabbare eftersom det tar bort den befintliga tabellen och skapar en ny.
4 DELETE-satsen hämtar radnivålåset. TRUNCATE TABLE låser datasidorna innan data tas bort.
5 Du kan ta bort specifika poster genom att använda WHERE-satsen Truncate table tar bort all data från tabellen.

Att använda TRUNCATE TABLE Statement i praktiken

Syntaxen för Truncate Table-satsen är följande:

TRUNCATE TABLE [DatabaseName].[TABLE_NAME]

Obs! Namnet på tabellen du vill ta bort posten från är efter TRUNCATE TABLE påstående. Anta att du vill trunkera tblStudent tabell. Frågan ska vara följande:

TRUNCATE TABLE tblStudent

För demonstrationen har jag installerat MySQL 8.0 Server och skapat en databas med namnet studentsDB . Där har jag skapat tabellerna som heter tblStudent , tblSchool, och tblStudentCounsiler.

Följande skript skapar databasen och tabellerna:

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;

Jag har skapat en främmande nyckel på tblStudent tabell som refererar till Skol-ID kolumnen i tblStudent bord.

Skriptet för att skapa en främmande nyckel är följande:

ALTER TABLE studentDB.tblstudent
ADD CONSTRAINT FK_tblstudent_SchoolID FOREIGN KEY (SchoolID)
REFERENCES studentDB.tblschool (SchoolID) ON DELETE NO ACTION;

ER-diagrammet är nedan:

Följande skript infogar den summerade datan i alla tabeller:

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

Låt oss nu förstå användningsfallen.

Låt oss först trunkera tblStudentCounsiler med följande fråga:

mysql> truncate table studentdb.tblStudentCounsiler;

Utgången :

Query OK, 0 rows affected (0.08 sec)

Kör SELECT-satsen för att se data:

mysql> select * from studentdb.tblStudentCounsiler;

Frågeutdata:

Empty set (0.01 sec)

Som du kan se i skärmdumpen ovan utfördes kommandot framgångsrikt.

Låt oss nu försöka trunkera tblSchool tabell med följande fråga:

mysql> Truncate table tblSchool;

Följande fel uppstår eftersom vi inte kan trunkera en tabell som refereras av en annan tabell:

ERROR 1701 (42000): Cannot truncate a table referenced in a foreign key constraint (`studentdb`.`tblstudent`, CONSTRAINT `FK_tblstudent_SchoolID`)

För att åtgärda detta fel måste vi släppa den främmande nyckeln. Kör följande fråga för att göra det:

mysql> ALTER TABLE tblstudent DROP FOREIGN KEY FK_tblstudent_SchoolID;

Frågeutgång:

Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0

När den främmande nyckeln har tappats, kör kommandot trunkate table:

mysql> Truncate table tblSchool;

Frågeutgång:

Query OK, 0 rows affected (0.08 sec)

Sammanfattning

Den aktuella artikeln introducerade TRUNCATE TABLE-satsen och dess egenskaper. Vi blev bekanta med skillnaderna mellan TRUNCATE TABLE och DELETE-kommandona, samt utforskade några praktiska exempel för att förtydliga begreppen.


  1. Hur man skapar ett fel i en MySQL-funktion

  2. SQL-rekursiv fråga på självreferenstabell (Oracle)

  3. Hur man inkluderar en PHP-variabel i en MySQL-sats

  4. SQL delad kommaseparerad rad