本文以一個簡單實例為大家介紹了SQL中truncate和delete的區別,幫助大家理解,具體內容如下
---創建表Table1
IF OBJECT_ID('Table1','U') IS NOT NULL
DROP TABLE Table1
GO
CREATE TABLE Table1
(ID INT NOT NULL,
FOID INT NOT NULL)
GO
--插入測試數據
INSERT INTO Table1
VALUES(1,101),(2,102),(3,103),(4,104)
GO
---創建表Table2
IF OBJECT_ID('Table2','U') IS NOT NULL
DROP TABLE Table2
GO
CREATE TABLE Table2
(
FOID INT NOT NULL)
GO
--插入測試數據
INSERT INTO Table2 VALUES(101),(102),(103),(104)
GO
SELECT * FROM Table1
GO
SELECT * FROM Table2
GO
在Table1表中創建觸發器,當表中的數據被刪除時同時刪除Table2表中對應的FOID
CREATE TRIGGER TG_Table1 ON Table1
AFTER DELETE
AS
BEGIN
DELETE FROM TA FROM Table2 TA INNER JOIN deleted TB ON TA.FOID=TB.FOID
END
GO
---測試DELETE刪除操作
DELETE FROM Table1 WHERE ID=1
GO
---執行觸發器成功,Table2表中的FOID=101的數據也被刪除
SELECT * FROM Table1
GO
SELECT * FROM Table2

---測試TRUNCATE刪除操作
TRUNCATE TABLE Table1
GO
---Table2中的數據沒有被刪除
SELECT * FROM Table1
GO
SELECT * FROM Table2

---查看TRUNCATE和DELETE的日志記錄情況
CHECKPOINT
GO
SELECT * FROM fn_dblog(NULL,NULL)
GO
DELETE FROM Table2
WHERE FOID=102
GO
SELECT * FROM fn_dblog(NULL,NULL)

在第四行記錄有一個lop_delete_rows,lcx_heap的刪除操作日志記錄
----TRUNCATE日志記錄
CHECKPOINT
GO
SELECT * FROM fn_dblog(NULL,NULL)
GO
TRUNCATE TABLE Table2
GO
SELECT * FROM fn_dblog(NULL,NULL)
GO

TRUNCATE操作沒有記錄刪除日志操作
主要的原因是因為TRUNCATE操作不會激活觸發器,因為TRUNCATE操作不會記錄各行的日志刪除操作,所以當你需要刪除一張表的數據時你需要考慮是否應該如有記錄日志刪除操作,而不是根據個人的習慣來操作。
以上就是本文的全部內容,希望對大家區分SQL中truncate和delete的使用方法有所幫助。
您可能感興趣的文章:- Oracle給用戶授權truncatetable的實現方案
- delete from 表名與truncate table 表名區別
- SQL中Truncate的用法
- golang實戰之truncate日志文件詳解
- tf.truncated_normal與tf.random_normal的詳細用法
- smarty中改進truncate使其支持中文的方法
- SQL Server中TRUNCATE事務回滾操作方法
- 詳解SQL中drop、delete和truncate的異同
- Mysql開啟慢SQL并分析原因
- Truncate Table的用法講解