(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_tbefore 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--正常插入
楼上那个人怎么不被封号呢?
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)