时间:2021-07-01 10:21:17 帮助过:40人阅读
在用Oracle时,出现了这样一个状况,添加模块时,只传入了一个模块名称,而表中还有一个模块ID,这个ID设定的是自增。但是在Orac
在使用Sql Server时,为了使得每条记录不会重复,加入了一个自增字段,并且将其设为主键。现在放开这样做的优劣。单单只说实现问题。
在用Oracle时,出现了这样一个状况,添加模块时,只传入了一个模块名称,而表中还有一个模块ID,这个ID设定的是自增。但是在Oracle中没有字段自增这个功能。但是可以通过自己写序列、触发器来实现这样的一个功能。
先说一下自增这个功能:自增,无非就是在插入的时候,自增的字段按照某种序列实现自动加一并且赋值。那么我们就再Oracle中创建一个序列,并且创建一个触发器,使其在插入的时候,序列自增1并且对自增字段进行赋值。
我用的是PL/SQL进行的可视化创建。
创建序列:
Name:序列的名字
Min Value:最小计数
Max Value:最大计数
Star with:从几开始
Increment by:步长
Cache Size:缓存序列
指定Cache,oracle会预先在内存中防止一组指定大小的序列,当使用完这些后再生成下一组,这样会存取的快些,但当数据库关闭等情况时,下一次再生成序列时可能会使序列间断,不是遗传连续的号,当不是特别需要连续的序列时,最好制定;
不填写Cache,会使用默认设置;当Cache设置为0或nocache,会产生连续的序列。
Cycle:循环序列,当达到最大值后,从最小值重新开始
Order:保证序列产生的顺序和请求的顺序是一直的,在并行模式下,,如果A、B同时对序列请求,那么先产生的序列号必然返回给先请求的用户。这种情况只发生在oracle并行服务器上(目前还没有接触),大多数情况下部需要。
创建触发器:
语句级(Statementlevel)触发器,在CreateTrigger语句中不包含foreachrow子句。语句级触发器对于触发事件只能触发一次,而且不能受触发器影响的每一行的列值。一般用与剧集触发器处理有关引起触发器触发的SQL语句的信息——例如,由谁来执行和什么时间执行。
行级(Row-level)触发器,在CreateTrigger语句中包含ForEachRow子句。行级触发器可对受触发器影响的每一行触发,并且能够访问原列值和通过SQL语句处理的新列值。行级触发器的典型应用是当需要知道行的列值时,执行一条事务规则。
确定后,会出现下面的画面
现在需要在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中。