-- 建立序列 CREATE SEQUENCE seq_userid INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE; -- 插入時指定 INSERT INTO users (userid, col1, col2) VALUES (seq_userid.NEXTVAL, 'v1', 'v2'); -- 同區塊重用 CURRVAL INSERT INTO users (userid, col1) VALUES (seq_userid.CURRVAL, 'v3'); -- PL/SQL 變數暫存 SELECT seq_userid.NEXTVAL INTO v_id FROM dual; -- 後續多處使用 v_id
CREATE SEQUENCE a_sequence START WITH 1 INCREMENT BY 1;
CREATE TABLE t (n NUMBER, v VARCHAR2(10));
CREATE OR REPLACE TRIGGER t_trg
BEFORE INSERT OR UPDATE ON t
FOR EACH ROW
BEGIN
SELECT a_sequence.NEXTVAL INTO :NEW.n FROM dual;
END;
/
-- 測試
INSERT INTO t VALUES (111, 'ok'); -- 傳入值會被覆蓋
SELECT * FROM t; -- n=1
| 維度 | 應用層 Sequence | Trigger 自動 |
|---|---|---|
| 可控性 | 高 (可決定何時取號) | 低 (隱性行為) |
| 移植性 | 需修改應用 SQL | 應用無感,遷移友善 |
| 效能 | 略優 (無 Trigger 開銷) | 微小開銷 |
| 批次匯入 | 易控制號碼範圍 | 需暫停 Trigger |
現代應用建議採用應用層 Sequence,配合 ORM 框架自動處理;舊系統或需資料庫層強制一致性時用 Trigger。