oracle建表空间,建表可以借PL/SQL进行创建,非常实用。
MySql中在字段定义后面使用 AUTO_INCREMENT 属性实现自增长,Oracle如何实现自增长主键?
介绍三种方法
一、序列
创建sequence
create sequence sequence_name
minvalue 1
maxvalue 99999999
start with 1
increment by 1
cache 20
如果ID自增长是定长而且可识别,可使用to_char格式化函数
Select 'Goods'||trim(to_char(mw_pos.seq_goodsid.nextval,'0009999999')) From dual
插入时执行
i
nsert into table_name(id,col2) values(sequence_name.nextval,'test');
二、序列+触发器
1.序列创建如上
2.创建触发器
create or replace trigger trg_insert_id
before insert on tablename
for each row
BEGIN
select sequence_name.nextval into :new.id from dual;
END;
插入时执行如下即可,不需要考虑id字段
insert into table_name(col2) values('test');
三、唯一序列 SYS_GUID()
select sys_guid() from dual
SYS_GUID()生成32位的唯一编码。
如果两个系统要进行合并,那么上述自增长主键就可能会出现重复,不利于维护合并。所以除了自增长主键之外,通常实际应用时,使用唯一序列作为主键(oracle:SYS_GUID() , mysql : UUID())
序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不合适将它作为并行或者远程环境里的主关键字,因为各自环境的序列可能会生成相同的数字,从而导致冲突。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则不能保证其值是唯一的)。
SYS_GUID不需要对数据库进行访问的时间戳和机器标识符,节省了查询的消耗。
很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,也就是说,在这样的数据集里,一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不是用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。
使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在那里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。而对序列而言,性能上的影响在查询期间,在这个时候SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。
SYS_GUID生成的值 另一个显著的不足之处是:管理这些值会变困难。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好的主意。除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。