请问各位,自增列(同时也是主键列)的实现:
1\定义序列,为列添加触发器(使用序列);
2\定义序列,在insert语句中使用序列;
3\直接在insert语句前,select max值使用;
哪种做法性能更好?

解决方案 »

  1.   

    第2种呀
    第1种用触发器,数据量大时性能用影响
    第3种同样
    而且oracle本身提供的方法肯定比我们自己写的要好一些。
      

  2.   

    这三种中“3\直接在insert语句前,select max值使用;”这种是最不好的
    因为在多用户并发的情况下,可能会出现重号的,因为oracle是读一致的,当没提交时select max取的值有可能一样(这个概率虽然很小,但有这种可能),第1种用触发器,因为用了触发器就会对性能有影响
      

  3.   

    可以用一个呀,在oracle的文档中有说明,以于所有number类型的列可以使用同一个序列。
      

  4.   

    都共用一个的话,我现在想到的一个缺点就是,会造成自增列的值不那么连续,当然也许这根本就不算什么问题.
    如果独立的话,我想到的一个缺点就是,必然要建立更多的序列,oracle维护更多的序列时,相对而言是不是加重了它的负担?不过,想区别一下:
    如果共用,有什么优缺点?如果独立有什么优缺点?
      

  5.   

    如果用序列,就别指望他会连续,因为序列是不受你的事务控制的
    select seq.nextval from dual一次不管你的自己的事务是否提交,它都会增加。共用也不共用没有什么实质的区别,只是看个人习惯程序的可读性来考虑了(我喜欢分开)
      

  6.   

    谢谢各位了,这个问题结了.顺便问下,存放包含中文字符的话,应该使用varchar2还是nvarchar2?或者说谁更好,好在哪?
      

  7.   

    varchar2就可以了,nvarchar2是支持多语言国际化的扩展