Oracle 自增加主鍵

  1. MySql中在字段定義後面使用 AUTO_INCREMENT 屬性實現自增加,Oracle如何實現自增加主鍵mysql

    1. 建表:web

    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:sql

    4. /*
      --建立序列Sequence
      create sequence seq_userId
      minvalue 100100      --最小值
      nomaxvalue      --不設置最大值(由機器決定),或 根據表字段的值範圍設置 maxvalue
      start with 100100    --從1開始計數,數值可變
      increment by 1  --每次加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

    若是兩個系統要進行合併,那麼上述自增加主鍵就可能會出現重複,不利於維護合併。因此除了自增加主鍵以外,一般實際應用時,使用惟一序列做爲主鍵(oracle:SYS_GUID() , mysql : UUID()性能

  3. SYS_GUID()生成32位的惟一編碼。

    序列生成器所生成的數字只能保證在單個實例裏是惟一的,這就不合適將它做爲並行或者遠程環境裏的主關鍵字,由於各自環境的序列可能會生成相同的數字,從而致使衝突。SYS_GUID會保證它建立的標識符在每一個數據庫裏都是惟一的。測試

    此外,序列必須是DML陳述式的一部分,所以它須要一個到數據庫的往返過程(不然不能保證其值是惟一的)。編碼

    SYS_GUID不須要對數據庫進行訪問的時間戳和機器標識符,節省了查詢的消耗。spa

    不少應用程序都依靠序列生成器來建立數據行的主關鍵字,這些數據行沒有一個明顯的主值,也就是說,在這樣的數據集裏,一條記錄的建立就會讓數據列發生改變。所以,管理員可能會對在表格中將SYS_GUID用做主關鍵字而不是用序列數感興趣。這在對象在不一樣機器的不一樣數據庫裏生成以及須要在後來合併到一塊兒的狀況下頗有用。code

    使用SYS_GUID或者序列會在數據庫使用週期裏的某些地方形成性能上的消耗;問題就是在那裏。對於SYS_GUID而言,性能上的影響在查詢時間和建立時間上(在表格裏要建立更多的塊和索引以容納數據)。而對序列而言,性能上的影響在查詢期間,在這個時候SGA序列的緩衝區被用光。在缺省狀況下,一個序列一次會緩衝20個值。若是數據庫沒有使用這些值就關閉了,它們就會被丟失。

    SYS_GUID生成的值 另外一個顯著的不足之處是:管理這些值會變困難。你必須(手動)輸入它們或者經過腳原本填充它們,或者將它們做爲web參數來傳遞。出於這些緣由,將SYS_GUID做爲一個主關鍵字不是一個很好的主意。除非是在一個並行的環境裏或者但願避免使用管理序列生成器的狀況下。

相關文章
相關標籤/搜索