ORACLE 序列sequence添加数据 重复添加

ORACLE 序列sequence添加数据 重复添加,第1张

(1)不排除以前执行过或手动插入过记录的可能。

(2)如果代码本身只是这么简单的代码,那我没看出来什么问题,如果代码并不是这么简单,那么就仔细检查一下代码,入股确定代码没有任何问题,那么我有了以下猜想。

(2)个人觉得很扯淡的一种解释(可能),你可以试验一下,未必是真的,但如果是真的,那就发现bug了

首先声明,我没试验过,仅仅是一种猜想,猜错了是绝对可能的,毕竟一般情况下怎么也不可能在最开始只添加一条数据

在最开始(划重点)的一条数据来说,应该是两条数据。因为有两个值,一个是init起始值,一个是nextval值,也就是说序列最开始(划重点)插入时至少是有两条数据的,这也就解释了为什么你的编号1,2插入时是两条,其他值插入值为1条。至于以后添加的nextval值,则都是以当前值为基础的,所以不会出现这种情况。当然这种情况应该只会出现在起始值+只添加一条数据的情况下。(以上均为猜测,具体的要靠你的试验来证明)

想排除这种可能,只要再建立一张表,一个序列,最开始(起始值)还是像这样一样只插入一条,看看是不是两条,如果是两条,那么就说明这猜测可能是真的,如果是一条,那就应该是我的猜想错误。

虽然我也知道猜想好像很扯淡,但是不妨试试。

oracle中没有递增列,只有sequence,至于表中的数据,需要自行使用sequence插入,或者自己写trigger完成。

如果是11g可以使用虚拟列来完成,你的需求不明确,自行添加吧,示例语句:

alter table t add (xhh as (to_number(hh)))

to_number函数改成你自己想加的条件。

写触发器啦。

给你举个例子照葫芦画瓢吧。

创建主表:

create table t

(id int,

name varchar2(100))

创建存放特殊字符的表:

create table t_mid

(id int)

insert into t_mid values (1)

commit

创建触发器:

create or replace trigger tri_t

before insert on t

for each row

  declare 

  v_cnt1 int

  v_cnt2 int

  begin

    select count(*) into v_cnt1 from t_mid where :new.id in (select id from t_mid)

    select count(*) into v_cnt2 from t where :new.id in (select id from t)

    if (v_cnt1>0 and v_cnt2>0)

      then

        rollback

      DBMS_OUTPUT.PUT_LINE('插入的id不属于特殊id,不允许重复插入')

    end if

  end

测试1(插入本表第一个数据):

insert into t values (1,'张三')

commit--正常插入

测试2:(继续插入id=1的数据)

insert into t values (1,'张三')

commit--这个时候会报错

测试3(插入id=2的数据)

insert into t values (2,'张三')

commit--正常插入

测试4(继续插入id=2的数据)

insert into t values (2,'张三')

commit--正常插入

楼上那个人怎么不被封号呢?


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11559400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存