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()好了,产生唯一编码。