oracle中的自增长列要通过sequence+trigger来实现
能确定列插入的先后顺序,不会出现重复子段
缺点:
如果用这个列作主键,oracle会自动创建一个索引,
但这个索引基本没什么作用
如果业务能确定主键的话,我认为比用这个好。

解决方案 »

  1.   

    为什么还要通过trigger来实现???
      

  2.   

    可用可不用,
    insert的时候取seq_name.nextval也可以
      

  3.   

    如果业务能确定关键字,为什么要用毫无意义的自增长列呢。 其实数据库提供了这项功能,你可以根据你的需求选择,没有要说一定需要使用oracle里sequence,sqlserver里有自增长列,也一样是提供某项功能而已,两者都是做为主键约束等的一个补助对象,如ORACLE的sequence是做为一个独立的对象存在,sqlserver是作为表的一个列存在如果想要自动长列,管理上当然是sqlserver较为方便
      

  4.   

    所以你应该知道为什么mssql和oracle不是一个档次了吧!!
      

  5.   

    SQL Server的自增长列不好用的,特别是在一个事务跨几个表的时候。那个时候你在主表
    插入了一行,但是你并不知道自增长列的值是多少,所以,在往子表中插入数据时就很困难。
    而Oracle做的就不错,通过序列来完成,不会有这方面的问题。
      

  6.   

    自增长列. 我认为就是一个功能.你也可以不用自增长列啊.比如自己确定主键,自己用select max(id)+1 from ,...来实现.oracle数据库较大,在操作的时候会同时很多人来操作该字段+1,oracle用sequence的cache 10来将序列的下十个值放到缓冲区中,这样会加快处理速度. 相比之下,oracle的sequence没什么坏处.
      

  7.   

    DongXY(老鹰) ,你说的我也有同感
      

  8.   

    如果业务能确定关键字,为什么要用毫无意义的自增长列呢:
        在数据库设计中,主表里的主键通常需要作为子表的外键,这样如果将业务字段作为主键的话,1是该字段数据在发生变化时需要修改主表及子表,麻烦!如果业务升级需要修改字段定义的话,就更麻烦了;2是业务数据往往比较长(甚至是几个字段的联合),这样主表的该字段索引也比较大,子表中重复数据(冗余)就大了,在插入、修改时需要查询主表该索引的值,所需要的时间就长了。
        因此数据库设计中往往使用一个仅作为主键使用的int字段,它没有业务意义,仅用来与其它表建立关系,如果你确定一个表不与其它任何表建立关系的话,该字段就完全不需要了。但关系数据库中有表不需要与其它表发生关系吗?那就不是关系数据库了!
      

  9.   

    谢谢各位踊跃讨论.我还有一个问题,既然自增长列的优点这么多,为什么oracle里没有设计一个列为自增长类型呢?多表操作(多条语句做一个事务),如果要引用一个自增长的列(考虑并发的情况),有什么好的办法,可以得到这个列的值呢?
      

  10.   

    我想ORACLE大概认为人人都知道怎么用sequence做自增列。最近用了一把postgresql,那个数据库的自增列字段就是数据库取用sequence的nexval加triggle做的。多表操作还是用sequence的nexval取值,没什么问题。
      

  11.   

    DongXY(老鹰)说的不错啊,单表时,你看不出序列的好处,当多表关联时,一个事务操作,你就可以看出序列的好处了,呵呵!!
      

  12.   

    这是SQL Server和Oracle的实现方法不同而已,没什么。
    在多表操作时,SQL Server也不会有问题。在跨事务的取值有IDENT_CURRENT方法。在同一事务对多表关联操作有受触发影响的@@Identity变量和不受触发影响的SCOPE_IDENTITY方法。所以SQL Server在实现多表关联特别的有主从表关系的Identity值的时候是不会有什么问题的。
      

  13.   

    谢谢各位,有兴趣大家留下email,多多交流。[email protected]