1. 程式人生 > >關於資料庫中的主鍵的自動增長

關於資料庫中的主鍵的自動增長

                    Mysql、SqlServer、Oracle主鍵自動增長的設定

        1、把主鍵定義為自動增長識別符號型別
在mysql中,如果把表的主鍵設為auto_increment型別,資料庫就會自動為主鍵賦值。例如:
create table customers(id int auto_increment primary key not null, name varchar(15));
insert into customers(name) values(“name1”),(“name2”);

        2、在MS SQLServer中,如果把表的主鍵設為identity型別,資料庫就會自動為主鍵賦值。例如:
create table customers(id int identity(1,1) primary key not null, name varchar(15));
insert into customers(name) values(“name1”),(“name2”);
identity包含兩個引數,第一個引數表示起始值,第二個引數表示增量。

        3、Oracle列中獲取自動增長的識別符號
在Oracle中,可以為每張表的主鍵建立一個單獨的序列,然後從這個序列中獲取自動增加的識別符號,把它賦值給主鍵。
例如一下語句建立了一個名為customer_id_seq的序列,這個序列的起始值為1,增量為2。

方法一、
create sequence customer_id_seq
INCREMENT BY 1 – 每次加幾個
START WITH 1 – 從1開始計數
NOMAXVALUE – 不設定最大值
NOCYCLE – 一直累加,不迴圈
CACHE 10;
一旦定義了customer_id_seq序列,就可以訪問序列的curval和nextval屬性。
curval:返回序列的當前值
nextval:先增加序列的值,然後返回序列值
create table customers(id int primary key not null, name varchar(15));
insert into customers values(customer_id_seq.curval, “name1”),(customer_id_seq.nextval, “name2”);

方法二、或者通過儲存過程和觸發器:
        1、通過新增儲存過程生成序列及觸發器:
create or replace PROCEDURE “PR_CREATEIDENTITYCOLUMN”
(tablename varchar2,columnname varchar2)
as
strsql varchar2(1000);
begin
strsql := ‘create sequence seq_’||tablename||’ minvalue 1 maxvalue 999999999999999999 start with 1 increment by 1 nocache’;
execute immediate strsql;
strsql := ‘create or replace trigger trg_’||tablename||’ before insert on ‘||tablename||’ for each row begin select seq_’||tablename||’.nextval into :new.’||columnname||’ from dual; end;’;
execute immediate strsql;
end;

        2、 對錶進行執行儲存過程
exec PR_CREATEIDENTITYColumn(‘XS_AUDIT_RECORD’,‘AUDIT_RECORD_ID’);
上一種方案對每一張表都要進行,下面根據使用者批量生成
select a.table_name, b.column_name from dba_constraints a, dba_cons_columns b
where a.constraint_name = b.constraint_name
and a.CONSTRAINT_TYPE = ‘P’
and a.owner=user;

        3、新增執行儲存過程的role許可權,修改儲存過程,加入Authid Current_User時儲存過程可以使用role許可權。
create or replace procedeate_ure p_crtable
Authid Current_User is
begin
Execute Immediate ‘create table create_table(id int)’;
end p_create_table;