Oracle 自增长主键

  1. MySql中在字段定义后面使用 AUTO_INCREMENT 属性实现自增长,Oracle如何实现自增长主键

    1. 建表:

    2. create table users(
        userId number(10) not null,
        username varchar2(30) not null,
        birthday date default null,
        sex char(1) default 1 check (sex in (0, 1)),
        address varchar2(200) not null,
        detail varchar2(1000) default 'no detail',
        socre number(4,2) default null,
        primary key (userId));
      
      /*
      --添加注释
      -- comment on table users is '用户表';
      -- comment on column users.userId is '用户编号';
      -- comment on column users.sex is '0: female 1: male';
      --修改表中字段的默认值
        alter table users modify (detail varchar2(1000) default ('no detail'));
        alter table users modify (sex char(1) default 1 check (sex in (0, 1)));
      -- 
      */
    3. 创建序列Sequence:

    4. /*
      --创建序列Sequence
      create sequence seq_userId
      minvalue 100100      --最小值
      nomaxvalue      --不设置最大值(由机器决定),或 根据表字段的值范围设置 maxvalue
      start with 100100    --从1开始计数,数值可变
      increment by 2  --每次加1,数值可变
      nocycle         --一直累加,不循环
      nocache         --不建缓冲区,如果建立cache那么系统将自动读取cache值 个seq,这样会加快运行速度;如果当机或oracle死了,那么下次读取的seq值将不连贯
      */
      
      create sequence seq_userId minvalue 100100 maxvalue 9999999999 start with 100100 increment by 1;
    5. 创建一个触发器来触发事件:每次insert操作时,自动生成一个sequence。

    6. --创建触发器
      create or replace trigger tg_insertUser
      before insert on users for each row when (new.userId is null)
      begin
        select seq_userId.Nextval into:new.userId from dual;
      end;
      
      --测试:
      insert into users (username, birthday, sex, address, socre) values ('Oracle', to_date('1991-08-25 19:55:45', 'yyyy-mm-dd hh24:mi:ss'), 1, 'ShangHai', 99.50);
  2. 唯一序列  SYS_GUID()

    如果两个系统要进行合并,那么上述自增长主键就可能会出现重复,不利于维护合并。所以除了自增长主键之外,通常实际应用时,使用唯一序列作为主键(oracle:SYS_GUID() , mysql : UUID()

  3. SYS_GUID()生成32位的唯一编码。

    序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不合适将它作为并行或者远程环境里的主关键字,因为各自环境的序列可能会生成相同的数字,从而导致冲突。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。

    此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则不能保证其值是唯一的)。

    SYS_GUID不需要对数据库进行访问的时间戳和机器标识符,节省了查询的消耗。

    很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,也就是说,在这样的数据集里,一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不是用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。

    使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在那里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。而对序列而言,性能上的影响在查询期间,在这个时候SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。

    SYS_GUID生成的值 另一个显著的不足之处是:管理这些值会变困难。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好的主意。除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。

你可能感兴趣的:(Oracle 自增长主键)