日期:2014-05-17  浏览次数:20984 次

oracle中DB设计时id唯一性(或者自增)怎么设置
最近刚使用oracle,不清楚oracle的id设计怎么比较合适,如果我使用序列的话,每一张表都要设计一个序列,感觉不合适吧,求助各位高手支招!!!

------解决方案--------------------
这个要根据你的业务吧,主键也可以由应用生成
每张表一个序列也并非不可,之后命名有规律,比如SQ_TABNAME,也未尝不可,还有,也可以多张表公用一个序列的
------解决方案--------------------
使用日期做序列,不也可以吗,比如 20130308102456  这样的序列还可以有规律,不仅可以了解数据的处理日期,每个日期到秒都是唯一的,不可能出现相同的时间,也可以连续,也可以不连续,并且有个好处:
1、当日后数据量变大,序列也不会变大,永远是这么几位数字,
2、当数据需要重新处理的时候,也不会出现序列重复出现,导致主键冲突
3、日期很好获取,不需要创建数据库对象
------解决方案--------------------
Orace没有SQL Server那样的自增序列。
我用ORACLE 10年了,都是自己对每个表单独建立一个 SEQUENCES 序列,然后再建一个触发器TRIGGERS
从不省懒。

CREATE SEQUENCE SEQ_S_MENU
  START WITH 1
  MAXVALUE 99999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  ORDER;

CREATE OR REPLACE TRIGGER tri_s_menu
  before insert ON S_MENU for each row
declare
  nextid number;
begin
  IF :new.menu_id IS NULL or :new.menu_id = '' THEN
    select SEQ_S_MENU.nextval into nextid from dual;
    :new.menu_id := nextid;
  end if;
end tri_s_menu;
/

这样针对每个表 成对 建立后,就跟SQL Server的自增序列差不多了。
------解决方案--------------------
引用:
引用:
使用日期做序列,不也可以吗,比如 20130308102456  这样的序列还可以有规律,不仅可以了解数据的处理日期,每个日期到秒都是唯一的,不可能出现相同的时间,也可以连续,也可以不连续,并且有个好处:
1、当日后数据量变大,序列也不会变大,永远是这么几位数字,
2、当数据需要重新处理的时候,也不会出现序列重复出现,导致主键冲突
3、日期很好获取,……


可以再建立一个序列,和日期混合使用,这样就可以解决批量插入的问题了
------解决方案--------------------
如果要保持唯一性的话,不如使用sys_guid()好了,产生唯一编码。