Oracle:配置讓插入語句時id自動輸入
無需手動指定,核心是利用?序列(Sequence)?或?自增列(Identity Column)?來自動生成唯一值。以下是兩種常用方案:
方案 1:使用序列(Sequence)自動生成(兼容兼容所有 Oracle 版本)
如果已經創建了序列列?emp_seq
(如你的 SQL 中用到的?emp_seq.NEXTVAL
),只需在插入入時省略?employee_id
?的賦值,讓觸發器或默認值自動引用序列:
步驟 1:創建序列(如果還沒創建)
首先創建一個序列用于生成主鍵
CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1;
如果只有此步,那么SQL語句插入是:
INSERT INTO employee_details (employee_id, first_name, last_name, email, phone, id_card, hire_date, salary, is_active)
VALUES (emp_seq.NEXTVAL, 'TestFirst', 'TestLast', 'test004@example.com', '13800138000', '110101199001011234', SYSDATE, 50000, 'Y');
步驟 2:修改表,添加默認值(推薦)
給?employee_id
?列設置默認值為序列的下一個值,這樣插入時可完全省略該字段:
ALTER TABLE employee_details
MODIFY (employee_id DEFAULT emp_seq.NEXTVAL);
步驟 3:簡化插入語句
INSERT INTO employee_details (first_name, last_name, email, phone, id_card, hire_date, salary, is_active)
VALUES ('TestFirst', 'TestLast', 'test005@example.com', '13800138000', '110101199001011234', SYSDATE, 50000, 'Y');
- 原理:
employee_id
?會自動使用默認值?emp_seq.NEXTVAL
,無需手動指定。
方案 2:使用自增列(Identity Column,Oracle 12c+ 支持)
Oracle 12c 及以上版本支持自增列,無需手動創建序列,更簡潔:
步驟 1:修改表,將?employee_id
?設為自增列
-- 如果表已存在,先刪除原列(謹慎!確保數據已備份)無數據最好
ALTER TABLE employee_details DROP COLUMN employee_id;-- 添加自增列
ALTER TABLE employee_details ADD (
employee_id NUMBER GENERATED ALWAYS AS IDENTITY?
START WITH 1?
INCREMENT BY 1
);
CREATE TABLE employee_details (-- 自增列設置(兩種模式二選一)employee_id NUMBER GENERATED ALWAYS AS IDENTITY (START WITH 1 -- 起始值(默認1)INCREMENT BY 1 -- 步長(默認1)NOCACHE -- 不緩存序列值(避免數據庫重啟后跳號)NOCYCLE -- 達到最大值后不循環(默認行為)),first_name VARCHAR2(50) NOT NULL,last_name VARCHAR2(50) NOT NULL,email VARCHAR2(100) UNIQUE,phone VARCHAR2(20),id_card VARCHAR2(18) UNIQUE,hire_date DATE DEFAULT SYSDATE,salary NUMBER(10, 2),is_active VARCHAR2(1) DEFAULT 'Y'
);
步驟 2:插入語句(完全省略?employee_id
)
INSERT INTO employee_details (first_name, last_name, email, phone, id_card, hire_date, salary, is_active)
VALUES ('TestFirst', 'TestLast', 'test005@example.com', '13800138000', '110101199001011234', SYSDATE, 50000, 'Y');
- 原理:
GENERATED ALWAYS AS IDENTITY
?會自動為?employee_id
?生成唯一遞增的值,無需序列。
兩種方案對比
方案 | 適用版本 | 優點 | 缺點 |
---|---|---|---|
序列 + 默認值 | 所有 Oracle 版本 | 兼容性好,可手動控制序列值 | 需要額外維護序列 |
自增列 | Oracle 12c+ | 無需手動創建序列,語法更簡潔 | 僅支持高版本,遷移兼容性稍差 |
總結
- 若使用 Oracle 12c 及以上,優先選擇?自增列,操作最簡單。
- 若版本較低,使用?序列 + 默認值,兼容性更好。
- 兩種方案都能實現?
employee_id
?自動輸入,插入語句中可完全省略該字段。
查詢唯一值約束語句
SELECT a.CONSTRAINT_NAME,a.CONSTRAINT_TYPE,b.COLUMN_NAME
FROM USER_CONSTRAINTS a
JOIN USER_CONS_COLUMNS b ON a.CONSTRAINT_NAME = b.CONSTRAINT_NAME
WHERE a.TABLE_NAME = 'EMPLOYEE_DETAILS'AND a.CONSTRAINT_TYPE IN ('P', 'U')
ORDER BY a.CONSTRAINT_NAME, b.POSITION;