建表遇到个问题,关于id自动增长的!
一个表有三个字段:
ID、name、parentID。
其中,ID是自动增长的,parentID是ID的外键。
但是有的情况下,parentID就是当前正在插入的元组的ID,这样的情况下怎么处理?
比如我要插入一条数据,name是root,ID是自动增长的,parentID就是这个自动增长的ID。我想到的做法是新建序列seq,若当前插入的元组的parentID是本身的ID,那么插入(seq.nextval,root,seq.nextval)。但是这样做,结果肯定是错误的,结果是(n,root,n+1)。
大家集思广益,帮我看看!
谢谢!

解决方案 »

  1.   

    不明白你在说什么,ID不想和ParentID一样是吗?写在Trigger里面不就可以了,当一样的时seq再向下取一个不就OK了.
      

  2.   


    这句是不是可以这么理解,插入的ID和parentID值是一样的。即DECLARE
      v_id NUMBER;
    BEGIN
      SELECT seq.nextval INTO v_id FROM DUAL;
      INSERT INTO tab1(id, name, parentID)
        VALUES(v_id, name, v_id)
      COMMIT;
    END;
    /
      

  3.   

    看来我没说清楚。那我举个例子吧!
    比如如下分类:
    体育>足球
    体育>篮球
    汽车>跑车>法拉利
    汽车>轿车>奔驰
    地区>广东>深圳>罗湖区
    ......我把上面的分类存放在数据库中,于是新建一张表Table_Category,有三列:
    ID、name、parentID.
    当把“足球”存进表时,ID自动增长,name是足球,parentID是体育的ID。这个没有问题,存入name和parentID就可以了,因为ID是自动增长的。
    但是如果之前存入“体育”时,parentID等于ID,这下怎么办呢?这下说清楚了吧!
      

  4.   

    但是如果之前存入“体育”时,parentID等于ID体育在这个层次中是最高层,其parentID应该为空,千万不能和ID一样,否则逻辑上会混乱的。
    对汽车和地区也是一样的
      

  5.   

    我表里parentID是ID的外键,难道把外键去掉?还有没有什么比较好的办法?
      

  6.   

    parentID是外键,其值可以为空,而且应该为空
      

  7.   

    没什么弊端,外键和非空是两个不同的约束。这可以根据实际需要,如果你想要它不空只要再加一个NOT NULL约束就可以了
      

  8.   

    再请教一个问题,我怎么把seq.nextval赋值给c#函数里的变量?
      

  9.   

    改成(seq.nextval,root,seq.curval)应该可以了
      

  10.   


    建议楼主自己试试,Oracle操作的实践性很强,多做测试对于提高能力是很必要的.
      

  11.   


    可以,select seq.nextval into 变量 from dual;