INSERT INTO table_name [(col1, col2, ...)] VALUES (val1, val2, ...);
NULL(或預設值)。-- 完整欄位插入
INSERT INTO dept VALUES (88, '研發部', '北京');
-- 錯誤:值數量不足
INSERT INTO dept VALUES (66, '美工部');
-- 指定欄位插入
INSERT INTO dept (deptno, dname) VALUES (99, '財務部');
INSERT INTO dept1 (id, name) SELECT deptno, dname FROM dept;
UPDATE table_name SET col1 = val1 [, col2 = val2, ...] [WHERE condition];
WHERE 將更新全表所有列。-- 全員加薪 88
UPDATE emp SET sal = sal + 88;
-- 單筆精準更新
UPDATE student2 SET phone = '010-51288984' WHERE name = '張三';
DELETE [FROM] table_name [WHERE condition];
WHERE 清空全表資料(表結構保留)。DELETE emp; -- 等同 DELETE FROM emp;
DELETE emp WHERE empno = 7778;
根據條件決定更新或插入,適用於資料同步場景。
MERGE INTO target_table [alias]
USING (source_table | view | subquery) [alias]
ON (join_condition)
WHEN MATCHED THEN
UPDATE SET col1 = val1, col2 = val2, ...
WHEN NOT MATCHED THEN
INSERT (col_list) VALUES (val_list);
-- 建立來源與目標表
CREATE TABLE test1 (eid NUMBER(10), name VARCHAR2(20), birth DATE, salary NUMBER(8,2));
CREATE TABLE test2 (eid NUMBER(10), name VARCHAR2(20), birth DATE, salary NUMBER(8,2));
INSERT INTO test1 VALUES (1001, 'Stone', DATE '2010-01-21', 8888);
INSERT INTO test1 VALUES (1002, 'Smith', DATE '2009-01-04', 6666);
-- 合併:依 eid 比對,存在則更新,不存在則插入
MERGE INTO test2 t2
USING test1 t1
ON (t1.eid = t2.eid)
WHEN MATCHED THEN
UPDATE SET t2.name = t1.name, t2.birth = t1.birth, t2.salary = t1.salary
WHEN NOT MATCHED THEN
INSERT (eid, name, birth) VALUES (t1.eid, t1.name, t1.birth);
注意:UPDATE SET 與 INSERT 子句中目標表欄位不可加表前綴,否則報「標識符無效」。
INSERT/UPDATE/DELETE/MERGE)。CREATE/ALTER/DROP/TRUNCATE)。GRANT/REVOKE)。-- 單一交易包含兩步:
-- 1. A 帳戶扣款
-- 2. B 帳戶入帳
-- 兩步必須同時成功或同時失敗
| 特性 | 說明 |
|---|---|
| 原子性 | 所有操作全成或全敗,視為不可分割整體 |
| 一致性 | 交易完成後資料處於合法狀態(如職級與薪資對應) |
| 隔離性 | 並發交易互不干擾,未提交變更對其他 Session 不可見 |
| 持久性 | 提交後永久生效,不可撤銷 |
| 事件 | 交易狀態 |
|---|---|
| 第一條可執行 SQL | 開始 |
| COMMIT / ROLLBACK | 結束 |
| DDL / DCL 指令 | 隱含提交並結束 |
| Session 正常結束 | 自動提交 |
| Session 異常中斷 / 系統崩潰 | 自動回滾 |
| 階段 | 資料可見性 | 鎖定狀態 | 可恢復性 |
|---|---|---|---|
| 提交/回滾前 | 僅當前 Session 可見 | 相關列鎖定,他 Session 僅可查詢 | 可恢復 |
| COMMIT 後 | 所有 Session 可見 | 釋放鎖定 | 永久生效,不可恢復 |
| ROLLBACK 後 | 還原修改前狀態 | 釋放鎖定 | 資料恢復一致 |
SAVEPOINT savepoint_name;
ROLLBACK TO savepoint_name;
INSERT INTO dept VALUES (55, 'Adv', 'Beijing');
INSERT INTO dept VALUES (56, 'Sec', 'Shanghai');
SAVEPOINT p1;
INSERT INTO dept VALUES (57, 'Acc', 'Dalian');
-- 僅回滾到 p1 之後的操作
ROLLBACK TO p1;
-- p1 之前的兩筆 INSERT 保留
前提:Session 為非自動提交模式。
SHOW AUTOCOMMIT; -- 查看設定
SET AUTOCOMMIT ON; -- 開啟自動提交
SET AUTOCOMMIT OFF; -- 關閉(預設)
OFF:需手動 COMMIT 才永久生效,新 Session 不可見未提交資料。ON:每條語句執行後自動提交。-- Session 1 (AUTOCOMMIT OFF)
INSERT INTO dept VALUES (88, 'Stone', 'Beijing');
SELECT * FROM dept; -- 可見 88
-- Session 2 (新視窗,同用戶登入)
SELECT * FROM dept; -- 不可見 88
-- Session 1
COMMIT;
-- Session 2
SELECT * FROM dept; -- 此時可見 88