如何实现Oracle自增,序列,触发器都有
### 如何实现Oracle主键自增,通过写sequence和触发器 在Oracle数据库中实现主键自增功能可以通过创建序列(sequence)与触发器(trigger)相结合的方式实现。这种方式不仅能够确保数据表中的主键唯一性,还能自动递增,极大地简化了开发人员的工作。 #### 创建Sequence(序列) 我们需要创建一个序列,用于生成唯一的、递增的值。在这个例子中,我们创建了一个名为`COMMON_SEQ`的序列,其定义如下: ```sql CREATE SEQUENCE COMMON_SEQ MINVALUE 1 MAXVALUE 999999999999999999999999999 START WITH 21 INCREMENT BY 1 CACHE 20; ``` - `MINVALUE`指定了序列的最小值,默认为1。 - `MAXVALUE`指定了序列的最大值,本例中设置为一个非常大的数字,意味着几乎不会达到上限。 - `START WITH`指定了序列的第一个值,在这里设置为21。 - `INCREMENT BY`指定了序列每次递增的步长,默认为1。 - `CACHE`指定了缓存中的序列值数量。如果系统崩溃或者重启,那么已经缓存的但未使用的序列值将丢失。 #### 创建Trigger(触发器) 接下来,我们创建一个触发器,它将在向表中插入新记录时自动设置主键字段。在这个例子中,我们创建了一个名为`TRG_test`的触发器,用于表`test`的插入操作: ```sql CREATE OR REPLACE TRIGGER TRG_test BEFORE INSERT ON test FOR EACH ROW DECLARE last_Sequence NUMBER; last_InsertID NUMBER; BEGIN IF (:NEW.id IS NULL) THEN SELECT common_seq.NEXTVAL INTO :NEW.id FROM DUAL; ELSE SELECT NVL(Last_Number, 0) INTO last_Sequence FROM User_Sequences WHERE UPPER(Sequence_Name) = UPPER('common_seq'); SELECT :NEW.id INTO last_InsertID FROM DUAL; WHILE (last_InsertID > last_Sequence) LOOP SELECT common_seq.NEXTVAL INTO last_Sequence FROM DUAL; END LOOP; END IF; END; ``` - `BEFORE INSERT ON test`表示在向`test`表中插入记录之前执行此触发器。 - `FOR EACH ROW`表示对于每个被插入的行都执行一次触发器逻辑。 - `DECLARE`关键字后声明了两个变量`last_Sequence`和`last_InsertID`用于存储序列的当前值和即将插入的ID。 - `IF (:NEW.id IS NULL)`检查新插入的行的ID是否为空。如果是,则使用序列的下一个值(`NEXTVAL`)填充它。 - 如果ID不为空,触发器会检查用户指定的ID是否超出了序列的当前值。如果是,则更新序列值以匹配用户指定的ID。 #### 使用Sequence和Trigger 通过上述步骤,当向表`test`中插入新记录时,如果该记录的ID字段为空,则会自动填充一个由`COMMON_SEQ`序列生成的新值。如果ID字段已有值,则触发器会确保序列值至少等于这个值,以避免未来插入的数据产生ID冲突。 这种结合使用序列和触发器的方法是Oracle中一种常见的主键自增实现方式。它不仅确保了主键的唯一性和连续性,还大大提高了数据插入效率。在实际应用中,根据具体需求调整序列的参数以及触发器的逻辑是非常重要的。例如,可以调整序列的起始值、增量步长等来适应不同的业务场景。
- AlanMathisonTuring2013-05-15oracle实现自增的格式
- gy05312012-10-12没有注释啊
- fengylm2013-06-10不错,挺简单的,对我有用
- 粉丝: 7
- 资源: 6
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助