Oracle:配置让插入语句时id自动输入
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;