首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle DML 核心語法速查:INSERT、DELETE、UPDATE 與事務控制要點

     編輯:Oracle 資料庫基礎

一、 INSERT 插入數據

-- 顯式列插值
INSERT INTO table_name (col1, col2, ...) VALUES (val1, val2, ...);

-- 子查詢插入 (跨表複製)
INSERT INTO target_table (col1, col2) SELECT col1, col2 FROM source_table;

關鍵規範

  • 字符/日期常量 必須單引號:'GOOD DAY'
  • 單引號轉義:'' 代表一個單引號
  • 長度校驗:超過定義長度報錯,入庫前應用層截斷/驗證
  • 日期處理:SYSDATE (秒級) / TO_DATE('2023-08-01','YYYY-MM-DD') / DATE '2023-08-01' (ANSI)
  • 大文本 (>4000) 必用 CLOB + DBMS_LOB 包
  • 自增主鍵:CREATE SEQUENCE seq_t INCREMENT BY 1 START WITH 1 MAXVALUE 999999 NOCACHE; 使用 seq_t.NEXTVAL

二、 DELETE 刪除數據

DELETE FROM table_name WHERE condition;

-- 全表清空 (DDL 隱式提交、不可回滾、釋放空間、重置 HWM)
TRUNCATE TABLE table_name;

核心差異: DELETE 產生 UNDO/REDO、觸發器、不釋放空間;TRUNCATE 直接釋放段空間、極快、無 WHERE。

三、 UPDATE 修改數據

UPDATE table_name SET col1 = val1, col2 = val2 ... WHERE condition;

陷阱:

  • 右值為 NULL → 列置空 (建議 NVL(val, default))
  • 超長度報錯
  • 無 WHERE → 全表更新 (災難級)
  • 大批量必須分批 COMMIT (建議 < 10k 行/批)

四、 事務控制與鎖機制

命令作用
COMMIT提交事務,釋放鎖,生效變更
ROLLBACK回滾事務,撤銷變更,釋放鎖
SAVEPOINT name設置保存點,支持部分回滾
ROLLBACK TO name回滾至保存點
SET TRANSACTION READ ONLY只讀事務 (一致性讀)
SELECT ... FOR UPDATE [NOWAIT|WAIT n]顯式行鎖 (悲觀鎖)

大事務風險控制

  • 單次 DML 影響行數 < 10,000
  • 循環提交模式:LOOP ... DELETE ... COMMIT; EXIT WHEN SQL%ROWCOUNT=0; END LOOP;
  • 監控 V$TRANSACTION、V$UNDOSTAT 防 UNDO 爆滿

五、 實戰模板:分批刪除歸檔數據

DECLARE
  v_deleted NUMBER := 0;
BEGIN
  LOOP
    DELETE FROM sys_log
    WHERE create_time < SYSDATE - 90
    AND ROWNUM <= 5000;
    
    v_deleted := v_deleted + SQL%ROWCOUNT;
    COMMIT;
    EXIT WHEN SQL%ROWCOUNT = 0;
    DBMS_LOCK.SLEEP(0.5);  -- 降低爭用
  END LOOP;
  DBMS_OUTPUT.PUT_LINE('Total deleted: ' || v_deleted);
END;
/

總結: DML 三板斧看似簡單,但事務邊界、鎖粒度、批量處理、空值處理才是區分新手與資深開發的分水嶺。養成「先 SELECT 驗證影響範圍、再 DML、小批量 COMMIT」的肌肉記憶。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved