Oracle数据库实现字段自增

时间:2022-08-20 12:23:31

        在使用SqlServer时,为了使得每条记录不会重复,加入了一个自增字段,并且将其设为主键。现在放开这样做的优劣。单单只说实现问题。

        在用Oracle时,出现了这样一个状况,添加模块时,只传入了一个模块名称,而表中还有一个模块ID,这个ID设定的是自增。但是在Oracle中没有字段自增这个功能。但是可以通过自己写序列、触发器来实现这样的一个功能。

        先说一下自增这个功能:自增,无非就是在插入的时候,自增的字段按照某种序列实现自动加一并且赋值。那么我们就再Oracle中创建一个序列,并且创建一个触发器,使其在插入的时候,序列自增1并且对自增字段进行赋值。

        我用的是PL/SQL进行的可视化创建。


        创建序列:


                Oracle数据库实现字段自增

                Name:序列的名字

                Min Value:最小计数

                Max Value:最大计数

                Star with:从几开始

                Increment by:步长

                Cache Size:缓存序列

                        指定Cache,oracle会预先在内存中防止一组指定大小的序列,当使用完这些后再生成下一组,这样会

                        存取的快些,但当数据库关闭等情况时,下一次再生成序列时可能会使序列间断,不是遗传连续的

                        号,当不是特别需要连续的序列时,最好制定;

                        不填写Cache,会使用默认设置;当Cache设置为0或nocache,会产生连续的序列。

                Cycle:循环序列,当达到最大值后,从最小值重新开始

                Order:保证序列产生的顺序和请求的顺序是一直的,在并行模式下,如果A、B同时对序列请求,那么先产

                        生的序列号必然返回给先请求的用户。这种情况只发生在oracle并行服务器上(目前还没有接触),大

                        多数情况下部需要。


        创建触发器:


                Oracle数据库实现字段自增

    语句级(Statementlevel)触发器,在CreateTrigger语句中不包含foreachrow子句。语句级

      触发器对于触发事件只能触发一次,而且不能受触发器影响的每一行的列值。一般用与剧集触发器处理

      有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。

    行级(Row-level)触发器,在CreateTrigger语句中包含ForEachRow子句。行级触发器可对受触

      发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是

      当需要知道行的列值时,执行一条事务规则。

    

        确定后,会出现下面的画面

                Oracle数据库实现字段自增

      现在需要在begin和end中间插入一句话 select SEQ_MODEL.Nextval INTO :new.mdlID FROM dual;

  不知道细心的你是不是看懂了上面的这句话?如果不能,那么看一下下嘛的补充

  补充:

    1)对于Insert语句,要呗插入的数值包含在new.column_name,这里的column_name是表中的一列

    2)对于Update语句,列的原值被包含在old_column_name中,数据列的新值在new.column_name

      中。

    3)对于Delete语句,将要删除的行的列值放在old.column_name中。