oracle建表的时候让其id自动增加

本文详细介绍了如何使用Oracle的序列(sequence)和触发器(trigger)实现键自动递增的功能,包括创建序列、触发器及应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
exec pro_create('LT_OA_SMS','SMSID');
 
 
 
首先执行第一步:

create   sequence   AUTO_ADD --序列名        (AUTO_ADD 为系列名,随便取名)
increment   by   1     --每次增加1
start   with    1    --从1开始
nomaxvalue     --没有最大值
nocache        --没有缓存序列

 

其次执行第二步:

create or replace trigger TRG_LT_COMMENDUSER    /*----(myProject)触发器名称----*/
before insert on LT_COMMENDUSER      /*----(PROJECT_MANAGE)表名----*/
for each row
begin
if (:new.COMMENDID is null) then      /*----(PRODUCTIONID)列名称----*/
    select AUTO_ADD.nextval into :new.COMMENDID from dual;   /*----(AUTO_ADD)序列名----*//*----(PRODUCTIONID)列名称----*/
end if;
end;

这是oracle的键自动递增的方法

<think>我们有两个需求:创时间(create time)和更新时间(update time)。创时间在插入时自动设置,而更新时间在每次更新记录时自动更新。 之前已经回答了创时间的设置(使用DEFAULT SYSTIMESTAMP),现在用户问的是更新时间的设置。 在Oracle中,没有像MySQL那样的ON UPDATE CURRENT_TIMESTAMP语法。为了实现更新时自动更新时间戳,我们需要使用触发器(Trigger)。 步骤: 1. 时,为更新时间字段(例如UPDATE_TIME)定义数据类型(TIMESTAMP),并可以设置默认值(例如SYSTIMESTAMP)用于插入时的初始值,但更新时不会自动改变,所以需要触发器。 2. 创一个BEFORE UPDATE触发器,在更新行之前将UPDATE_TIME字段设置为当前时间戳。 示例: 假设我们有一个USER_INFO,已经有一个CREATE_TIME字段(用于创时间),现在要添加一个UPDATE_TIME字段(用于更新时间)。 语句(包含两个时间字段): CREATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP, -- 插入时自动填充 UPDATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP -- 插入时也设置默认值,但更新时需要触发器来更新 然后创触发器: CREATE OR REPLACE TRIGGER USER_INFO_UPDATE_TRG BEFORE UPDATE ON USER_INFO FOR EACH ROW BEGIN :NEW.UPDATE_TIME := SYSTIMESTAMP; END; 注意:在触发器中,我们使用:NEW.UPDATE_TIME来引用正在更新的行的新值,并将其设置为当前时间戳(SYSTIMESTAMP)。 完整示例: 创: ```sql CREATE TABLE USER_INFO ( ID VARCHAR2(32) NOT NULL, USER_NAME VARCHAR2(50), CREATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP, UPDATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP, -- 插入时也会使用默认值 PRIMARY KEY (ID) ); ``` 创触发器: ```sql CREATE OR REPLACE TRIGGER USER_INFO_UPDATE_TRG BEFORE UPDATE ON USER_INFO FOR EACH ROW BEGIN :NEW.UPDATE_TIME := SYSTIMESTAMP; END; / ``` 这样,当插入记录时,CREATE_TIME和UPDATE_TIME都会被设置为插入时的时间戳(因为都有默认值)。 当更新记录时,触发器会将UPDATE_TIME更新为当前时间戳。 注意:如果已经存在,我们可以通过ALTER TABLE添加字段,然后再创触发器。 例如,在现有上添加UPDATE_TIME字段并创触发器: ```sql -- 添加字段,并设置默认值为当前时间戳(这样已有记录的该字段为NULL,新插入的记录会有默认值) ALTER TABLE USER_INFO ADD (UPDATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP); -- 然后创触发器 CREATE OR REPLACE TRIGGER USER_INFO_UPDATE_TRG BEFORE UPDATE ON USER_INFO FOR EACH ROW BEGIN :NEW.UPDATE_TIME := SYSTIMESTAMP; END; / ``` 但是,如果已有记录,我们可能希望将UPDATE_TIME初始化为某个值(比如当前时间),可以在添加字段后执行更新: ```sql UPDATE USER_INFO SET UPDATE_TIME = SYSTIMESTAMP; ``` 但要注意,这个操作会更新所有现有记录,可能会消耗较长时间。 另外,关于引用[2]中提到的特殊字符处理,在触发器中我们使用的是SYSTIMESTAMP,没有特殊字符问题。 引用[3]中提到了外键,但本问题不涉及外键,所以不需要考虑。 总结:在Oracle中,实现更新时自动更新时间戳,需要使用触发器。 注意事项: 1. 触发器是数据库对象,需要维护,避免创过多触发器影响性能。 2. 触发器中的操作要简单,这里只是更新时间戳,所以影响不大。 相关问题: 1. 如何在现有Oracle中添加更新时间字段并设置触发器? 2. Oracle中如何管理触发器(查看、修改、删除)? 3. 如何避免在更新某些字段时不触发更新时间戳的更新?(例如,只更新某个状态字段但不想改变更新时间)</think>在Oracle中,要实现记录更新时自动更新时间戳字段,需要使用触发器(Trigger)。以下是详细实现步骤: ### 完整解决方案 #### 1. **创时定义更新时间字段** ```sql CREATE TABLE USER_INFO ( ID VARCHAR2(32) NOT NULL PRIMARY KEY, USER_NAME VARCHAR2(50), -- 创时间:插入时自动填充 CREATE_TIME TIMESTAMP DEFAULT SYSTIMESTAMP, -- 更新时间:通过触发器自动更新 UPDATE_TIME TIMESTAMP ); ``` #### 2. **创触发器实现自动更新** ```sql CREATE OR REPLACE TRIGGER USER_INFO_UPDATE_TRG BEFORE UPDATE ON USER_INFO FOR EACH ROW BEGIN :NEW.UPDATE_TIME := SYSTIMESTAMP; END; / ``` ### 关键说明 1. **触发器工作原理**: - `BEFORE UPDATE`:在更新操作前触发 - `FOR EACH ROW`:对每行记录生效 - `:NEW.UPDATE_TIME`:指向待更新记录的新值 - `SYSTIMESTAMP`:Oracle获取当前时间戳的函数 2. **验证效果**: ```sql -- 插入记录 INSERT INTO USER_INFO (ID, USER_NAME) VALUES ('001', '张三'); -- 更新记录(触发器自动更新时间戳) UPDATE USER_INFO SET USER_NAME = '李四' WHERE ID = '001'; -- 查询结果 SELECT * FROM USER_INFO; ``` 输出示例: ``` ID | USER_NAME | CREATE_TIME | UPDATE_TIME -----|-----------|--------------------------|-------------------------- 001 | 李四 | 2023-10-05 09:30:45.123 | 2023-10-05 10:15:22.567 ``` ### 高级配置 #### 1. **排除特定字段更新** 避免某些字段更新时触发时间戳变更: ```sql CREATE OR REPLACE TRIGGER USER_INFO_UPDATE_TRG BEFORE UPDATE ON USER_INFO FOR EACH ROW WHEN (OLD.STATUS != NEW.STATUS) -- 仅当status变化时触发 BEGIN :NEW.UPDATE_TIME := SYSTIMESTAMP; END; / ``` #### 2. **同时管理创/更新时间** 合并创和更新触发器: ```sql CREATE OR REPLACE TRIGGER USER_INFO_TIME_TRG BEFORE INSERT OR UPDATE ON USER_INFO FOR EACH ROW BEGIN IF INSERTING THEN :NEW.CREATE_TIME := SYSTIMESTAMP; ELSIF UPDATING THEN :NEW.UPDATE_TIME := SYSTIMESTAMP; END IF; END; / ``` ### 注意事项 1. **权限要求**: ```sql GRANT CREATE TRIGGER TO your_user; -- 需要触发器权限 ``` 2. **性能影响**: - 行级触发器对性能影响较小(毫秒级) - 避免在触发器中执行复杂SQL[^1] 3. **特殊字符处理**: 若字段值含特殊字符(如`&`),使用`SET DEFINE OFF`关闭转义[^2] > 通过触发器机制,Oracle实现了类似MySQL的`ON UPDATE CURRENT_TIMESTAMP`功能,确保数据每次更新时自动维护时间戳字段。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值