当前位置: 首页 > news >正文

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;

http://www.xdnf.cn/news/1330939.html

相关文章:

  • 生产环境MongoDB分片策略优化与故障排查实战经验分享
  • 翻译记忆库(TMX)与机器翻译的结合应用
  • ​​pytest+yaml+allure接口自动化测试框架
  • 计算机视觉(二)------OpenCV图像视频操作进阶:从原理到实战
  • MYSQL-增删查改CRUD
  • 遥感机器学习入门实战教程|Sklearn 案例④ :多分类器对比(SVM / RF / kNN / Logistic...)
  • 【C++】--指针与引用深入解析和对比
  • 2025 | 腾讯混元RLVMR颠覆强化学习:可验证推理奖励引爆AI智能体新范式!
  • 文本智能抽取:如何用NLP从海量文本中“炼“出真金?-告别无效阅读,让AI成为你的“信息炼金师
  • git 生成 Patch 和打 Patch
  • 在完全没有无线网络(Wi-Fi)和移动网络(蜂窝数据)的环境下,使用安卓平板,通过USB数据线(而不是Wi-Fi)来控制电脑(版本2)
  • 汽车ECU实现数据安全存储(机密性保护)的一种方案
  • 网页作品惊艳亮相!这个浪浪山小妖怪网站太治愈了!
  • uni-app跨端开发最后一公里:详解应用上架各大应用商店全流程
  • 云计算学习100天-第26天
  • 《CDN加速的安全隐患与解决办法:如何构建更安全的网络加速体系》
  • 【Ansible】变量、机密、事实
  • Ubuntu-安装Epics Archiver Appliance教程
  • ansible playbook 实战案例roles | 实现基于firewalld添加端口
  • 如何使用matlab将目录下不同的excel表合并成一个表
  • 四川方言语音识别数据集,1500小时合规真人采集,高质量标注助力ASR与大模型训练
  • CISP-PTE之路--10文
  • java17学习笔记
  • python numpy.random的基础教程(附opencv 图片转数组、数组转图片)
  • cv2.bitwise_and是 OpenCV 中用于执行按位与运算的核心函数,主要用于图像处理中的像素级操作
  • 计算机视觉 图片处理 在骨架化过程中,每次迭代都会从图像的边缘移除一层像素,直到只剩下单像素宽度的骨架
  • 【图像算法 - 19】慧眼识苗:基于深度学习与OpenCV的大棚农作物生长情况智能识别检测系统
  • Kubernetes集群安装部署--flannel
  • InnoDB为什么使用B+树实现索引?
  • 从繁琐到优雅:Java Lambda 表达式全解析与实战指南