詳解資料庫SQL中的三個語句:DROP、TRUNCATE 、DELETE

来源:https://www.cnblogs.com/huaweiyun/archive/2023/11/16/17836188.html
-Advertisement-
Play Games

本文以GaussDB資料庫為平臺,將詳細介紹SQL中DROP、TRUNCATE和DELETE等語句的含義、使用場景以及註意事項,幫助讀者更好地理解和掌握這些常用的資料庫操作命令。 ...


本文分享自華為雲社區《GaussDB資料庫SQL系列-DROP & TRUNCATE & DELETE》,作者:Gauss松鼠會小助手2 。

一、前言

在資料庫中,SQL作為一種常用的資料庫編程語言,扮演著至關重要的角色。SQL不僅可以用於創建、修改和查詢資料庫,還可以通過DROP、DELETE和TRUNCATE等語句來刪除數據。這些語句是SQL語言中的最常用的命令,且它們有著不同的含義和使用場景。

本文以GaussDB資料庫為平臺,將詳細介紹SQL中DROP、TRUNCATE和DELETE等語句的含義、使用場景以及註意事項,幫助讀者更好地理解和掌握這些常用的資料庫操作命令。

二、GaussDB的 DROP & TRUNCATE & DELETE 簡述

1、簡述

• DROP語句可以刪除整個表,包括表結構和數據;

• TRUNCATE語句則可以快速地刪除表中的所有數據,但不刪除表結構。

• DELETE語句可以刪除表中的數據,不包括表結構;

2、命令比對

大類

DROP

TRUNCATE

DELETE

SQL類型

DDL

DDL

DML

刪除內容

刪除表的所有數據,包括表結構、索引和許可權等

刪除表中所有數據,或指定分區的數據

刪除表的全部或部分(+條件)數據

執行速度

速度最快

速度中等

速度最慢

Tip:在GaussDB資料庫中,DROP是用於定義或修改資料庫中的對象的命令之一。對象主要包括:庫、模式、表空間、表、索引、視圖、存儲過程、函數、加密秘鑰等,本次只針對其對錶的操作。

三、GaussDB的DROP TABLE命令及示例

1、功能描述

DROP TABLE的功能是用來刪除已存在的Table。

2、語法

DROP TABLE [IF EXISTS] [db_name.]table_name;

說明:SQL中加[IF EXISTS] ,可以防止因表不存在而導致執行報錯。

參數:db_name:Database名稱。如果未指定,將選擇當前database。table_name:需要刪除的Table名稱。

3、示例

以下示例演示DROP命令的使用,依次執行如下SQL語句:

--刪除整個表course

DROP TABLE IF EXISTS course

--創建course表

CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));

--初始化數據

INSERT INTO course VALUES('01' , '語文' , '02');

INSERT INTO course VALUES('02' , '數學' , '01');

INSERT INTO course VALUES('03' , '英語' , '03');

--3條記錄

SELECT count(1) FROM course;

--刪除整個表

DROP TABLE IF EXISTS course

--查看結果,表不存在(表結構及數據不存在)

SELECT count(1) FROM course;

1)DROP TABLE,提示表不存在

cke_120.png

2)創建並初始化一張實驗表

cke_121.png

3)DROP TABLE 執行成功

cke_122.png

4)查看執行結果

cke_123.png

四、GaussDB的TRUNCATE命令及示例

1、功能描述

從表或表分區中移除所有數據,TRUNCATE快速地從表中刪除所有行。它和在目標表上進行無條件的DELETE有同樣的效果,但由於TRUNCATE不做表掃描,因而快得多, 且使用的系統和事務日誌資源少。在大表上操作效果更明顯。

TRUNCATE TABLE 刪除表中的所有行,但表結構及其列、約束、索引等保持不變。新行標識所用的計數值重置為該列的種子。

2、語法

TRUNCATE [TABLE] table_name;

ALTER TABLE [IF EXISTS] table_name TRUNCATE PARTITION { partition_name | FOR ( partition_value [, ...] ) }

參數:table_name:需要刪除數據的Table名稱。partition_name:需要刪除的分區表的分區名稱。partition_value:需要刪除的分區表的分區值。

3、示例1

以下示例演示TRUNCATE命令的使用:

--創建course表

DROP TABLE IF EXISTS course;

CREATE TABLE course(cid VARCHAR(10),cname VARCHAR(10),teid VARCHAR(10));

--初始化數據

INSERT INTO course VALUES('01' , '語文' , '02');

INSERT INTO course VALUES('02' , '數學' , '01');

INSERT INTO course VALUES('03' , '英語' , '03');

--3條記錄

SELECT count(1) FROM course;

--清空表

TRUNCATE TABLE course;

--或

TRUNCATE course;

--0條記錄

SELECT count(1) FROM course;

1)創建實驗表並初始化數據

cke_124.png

2)TRUNCATE TABLE執行成功

cke_125.png

3)查看執行結果

cke_126.png

4、示例2

以下示例演示TRUNCATE命令的刪除分區表數據

--創建列表分區(LIST)

DROP TABLE IF EXISTS orders;

CREATE TABLE orders (

id INT PRIMARY KEY,

customer_id INT,

order_date DATE,

product_id INT,

quantity INT

) PARTITION BY LIST (customer_id) (

PARTITION p1 VALUES (100),

PARTITION p2 VALUES (200),

PARTITION p3 VALUES (300),

PARTITION p4 VALUES (400),

PARTITION p5 VALUES (500)

);

--插入測試數據

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1001,100,date'20230822',1,10);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1002,100,date'20230822',2,20);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1003,100,date'20230822',3,30);

INSERT INTO orders(id,customer_id,order_date,product_id,quantity)VALUES(1004,200,date'20230822',4,40);

--查看分區p1、p2的數據

SELECT * FROM orders WHERE customer_id IN (100,200);

----根據分區名稱查詢

SELECT * FROM orders PARTITION(p2);

--清空分區p1。

ALTER TABLE orders TRUNCATE PARTITION p1;

--或者

--清空分區p2=200。

ALTER TABLE orders TRUNCATE PARTITION for (200);

--查看分區p1、p2的數據

SELECT * FROM orders WHERE customer_id IN (100,200);

1)創建實驗表並初始化

cke_127.png

2)根據分區進行刪數據

cke_128.png

五、GaussDB的DELETE命令及示例

1、功能描述

從指定的表裡刪除滿足WHERE子句的行。如果WHERE子句不存在,將刪除表中所有行,結果只保留表結構。

2、註意事項

• 不支持DELETE語句中使用LIMIT。應使用WHERE條件明確需要更新的目標行。

• 不支持在單條SQL語句中,對多個表進行刪除。

• DELETE語句中必須有WHERE子句,避免全表掃描。

• DELETE語句中禁止不應使用ORDER BY、GROUP BY子句,避免不必要的排序。

• 如果需要清空一張表,建議使用TRUNCATE,而不是DELETE。

• TRUNCATE會創建新的物理文件,併在事務結束時將原文件物理刪除,清空磁碟空間。而DELETE會將表中數據進行標記,直到VACCUUM FULL階段才會真正清理磁碟空間。

• DELETE有主鍵或索引的表,WHERE條件應結合主鍵或索引,提高執行效率。

• DELETE 語句每次刪除一行,併在事務日誌中為所刪除的每行記錄一項。

• 如果想保留標識計數值,請改用 DELETE

3、語法

DELETE FROM table_name [WHERE condition];

參數:table_name:需要刪除數據的Table名稱。condition:用於判斷哪些行需要被刪除。

4、示例

復用前面的實驗表:

1)刪除orders表中customer_id <200的所有數據:

DELETE FROM orders WHERE customer_id <200;

cke_129.png

六、應用場景

• 需要根據一定的業務條件刪除數據時、且數據量、性能可控的情況下,可以考慮使用 DELETE。

• 需要刪除大批量數據時,同時要求速度快,效率高並且無需撤銷時,可以使用 TRUNCATE。

• 在企業級開發中,實際上都是進行邏輯刪除(將數據進行“刪除標識”處理)、而並不進行物理上的刪除。

• 在實際生產環境中,一般情況下刪除業務處理(過渡表)中的數據。

• 在實際企業開發、維護過程中,不管使用 DELETE、TRUNCATE還是DROP命令前,都要考慮數據的備份。

七、小結

在GaussDB等資料庫中,DROP、TRUNCATE和DELETE均是常用的刪除數據的命令。但在實際業務使用中,需要根據不同的需求進行準確的選擇,但無論選擇那種刪數方式,都需要考慮數據安全性——重要的事情說三遍:備份!備份!備份!

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 日誌在程式中的重要性非常的重要,當系統發生故障時,我們要隨時能排查出相關的日誌,細數日誌在Rust中的定義依賴及其實現。 ...
  • 本文討論了一次故障排查的過程,通過監控工具和分析信息,但最終沒有找到根本原因。文章強調了故障排查的複雜性和重要性,提醒保持冷靜和耐心,在團隊合作和知識共用的基礎上解決問題,並總結了從這次故障中學到的經驗和教訓。 ...
  • 前言 看過不少關於 await 的原理的文章,也知道背後是編譯器給轉成了狀態機實現的,但是具體是怎麼完成的,回調又是如何銜接的,一直都沒有搞清楚,這次下定決心把源碼自己跑了下,終於豁然開朗了 本文的演示代碼基於 VS2022 + .NET 6 示例 public class Program { st ...
  • 哈嘍大家好,我是鹹魚 最近這段時間比較忙,將近一周沒更新文章,再不更新我那為數不多的粉絲量就要庫庫往下掉了 T﹏T 剛好最近在學 Kafka,於是決定寫篇跟 Kafka 相關的文章(文中有不對的地方歡迎大家指出) 考慮到有些小伙伴可能是第一次接觸 Kafka ,所以先簡單介紹一下什麼是 Kafka ...
  • 零基礎快速上手STM32開發(手把手保姆級教程) 1. 前言 作為一名嵌入式工程師,STM32 是必須要學習的一款單片機,同時這款單片機資料足夠多,而且比較簡單,非常適合初學者入門。 STM32 是一款由 STMicroelectronics 公司開發的 32 位微控制器,由於其強大的處理能力和廣泛 ...
  • 簡介 SQL(Structured Query Language)是一種用於訪問和操作關係型資料庫的標準語言。它是一個功能強大的語言,用於執行各種資料庫操作,包括檢索數據、插入新記錄、更新記錄、刪除記錄、創建資料庫、創建新表、設置許可權以及執行存儲過程和視圖等。以下是 SQL 的一些重要方面: SQL ...
  • sql server 2005安裝包sql server 2005 SP4補丁包(非常難找,留作備用) 鏈接: https://pan.baidu.com/s/1j5OOX-iV8gLrmSNqNLE-kg 提取碼: jvtr 複製這段內容後打開百度網盤手機App,操作更方便哦 背景: 在windo ...
  • 嘗試用node編寫一個簡單的登錄介面,結果啟動服務後請求介面出現了該錯誤。 其問題就是訪問的工具身份驗證協議過於落後,在node內安裝的2.18.1 mysql包。 解決: 先登錄資料庫。 use mysql;(mysql為資料庫名) 提示Database changed; 查詢表中信息 ; sel ...
一周排行
    -Advertisement-
    Play Games
  • 前言 微服務架構已經成為搭建高效、可擴展系統的關鍵技術之一,然而,現有許多微服務框架往往過於複雜,使得我們普通開發者難以快速上手並體驗到微服務帶了的便利。為瞭解決這一問題,於是作者精心打造了一款最接地氣的 .NET 微服務框架,幫助我們輕鬆構建和管理微服務應用。 本框架不僅支持 Consul 服務註 ...
  • 先看一下效果吧: 如果不會寫動畫或者懶得寫動畫,就直接交給Blend來做吧; 其實Blend操作起來很簡單,有點類似於在操作PS,我們只需要設置關鍵幀,滑鼠點來點去就可以了,Blend會自動幫我們生成我們想要的動畫效果. 第一步:要創建一個空的WPF項目 第二步:右鍵我們的項目,在最下方有一個,在B ...
  • Prism:框架介紹與安裝 什麼是Prism? Prism是一個用於在 WPF、Xamarin Form、Uno 平臺和 WinUI 中構建鬆散耦合、可維護和可測試的 XAML 應用程式框架 Github https://github.com/PrismLibrary/Prism NuGet htt ...
  • 在WPF中,屏幕上的所有內容,都是通過畫筆(Brush)畫上去的。如按鈕的背景色,邊框,文本框的前景和形狀填充。藉助畫筆,可以繪製頁面上的所有UI對象。不同畫筆具有不同類型的輸出( 如:某些畫筆使用純色繪製區域,其他畫筆使用漸變、圖案、圖像或繪圖)。 ...
  • 前言 嗨,大家好!推薦一個基於 .NET 8 的高併發微服務電商系統,涵蓋了商品、訂單、會員、服務、財務等50多種實用功能。 項目不僅使用了 .NET 8 的最新特性,還集成了AutoFac、DotLiquid、HangFire、Nlog、Jwt、LayUIAdmin、SqlSugar、MySQL、 ...
  • 本文主要介紹攝像頭(相機)如何採集數據,用於類似攝像頭本地顯示軟體,以及流媒體數據傳輸場景如傳屏、視訊會議等。 攝像頭採集有多種方案,如AForge.NET、WPFMediaKit、OpenCvSharp、EmguCv、DirectShow.NET、MediaCaptre(UWP),網上一些文章以及 ...
  • 前言 Seal-Report 是一款.NET 開源報表工具,擁有 1.4K Star。它提供了一個完整的框架,使用 C# 編寫,最新的版本採用的是 .NET 8.0 。 它能夠高效地從各種資料庫或 NoSQL 數據源生成日常報表,並支持執行複雜的報表任務。 其簡單易用的安裝過程和直觀的設計界面,我們 ...
  • 背景需求: 系統需要對接到XXX官方的API,但因此官方對接以及管理都十分嚴格。而本人部門的系統中包含諸多子系統,系統間為了穩定,程式間多數固定Token+特殊驗證進行調用,且後期還要提供給其他兄弟部門系統共同調用。 原則上:每套系統都必須單獨接入到官方,但官方的接入複雜,還要官方指定機構認證的證書 ...
  • 本文介紹下電腦設備關機的情況下如何通過網路喚醒設備,之前電源S狀態 電腦Power電源狀態- 唐宋元明清2188 - 博客園 (cnblogs.com) 有介紹過遠程喚醒設備,後面這倆天瞭解多了點所以單獨加個隨筆 設備關機的情況下,使用網路喚醒的前提條件: 1. 被喚醒設備需要支持這WakeOnL ...
  • 前言 大家好,推薦一個.NET 8.0 為核心,結合前端 Vue 框架,實現了前後端完全分離的設計理念。它不僅提供了強大的基礎功能支持,如許可權管理、代碼生成器等,還通過採用主流技術和最佳實踐,顯著降低了開發難度,加快了項目交付速度。 如果你需要一個高效的開發解決方案,本框架能幫助大家輕鬆應對挑戰,實 ...