日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段

發布時間:2024/2/28 数据库 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在Oracle、MySQL、MS SQL Server中創建自動增長字段

好吧,今天面試有道題,要各個數據庫怎么建立自增長字段,順便復習一下吧,最近面試很多數據庫問題。。。

一:Oracle

Oracle中創建自增長字段,要建序列和觸發器,

1.先創建序列通過創建序列來實現

ORACLE SEQUENCE的簡單介紹

在oracle中sequence就是所謂的序列號,每次取的時候它會自動增加,一般用在需要按序列號排序的地方。

1、Create Sequence

你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE權限,

CREATE SEQUENCE emp_sequence

INCREMENT BY 1 -- 每次加幾個

START WITH 1 -- 從1開始計數

NOMAXVALUE -- 不設置最大值

NOCYCLE -- 一直累加,不循環

CACHE 10;

一旦定義了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回 sequence的當前值

NEXTVAL=增加sequence的值,然后返回 sequence 值

比如:

emp_sequence.CURRVAL

emp_sequence.NEXTVAL

可以使用sequence的地方:

- 不包含子查詢、snapshot、VIEW的 SELECT 語句

- INSERT語句的子查詢中

- NSERT語句的VALUES中

- UPDATE 的 SET中

可以看如下例子:

INSERT INTO emp VALUES

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20);

SELECT empseq.currval FROM DUAL;

但是要注意的是:

- 第一次NEXTVAL返回的是初始值;隨后的NEXTVAL會自動增加你定義的INCREMENT BY值,然后返回增加后的值。CURRVAL 總是返回當前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否則會出錯。一次NEXTVAL會增加一次SEQUENCE的值,所以如果你在同一個語句里面使用多個NEXTVAL,其值就是不一樣的。明白?

- 如果指定CACHE值,ORACLE就可以預先在內存里面放置一些sequence,這樣存取的快些。cache里面的取完后,oracle自動再取一組到cache。 使用cache或許會跳號, 比如數據庫突然不正常down掉(shutdown abort),cache中的sequence就會丟失. 所以可以在create sequence的時候用nocache防止這種情況。

2、Alter Sequence

你或者是該sequence的owner,或者有ALTER ANY SEQUENCE 權限才能改動sequence. 可以alter除start至以外的所有sequence參數.如果想要改變start值,必須 drop sequence 再 re-create .

Alter sequence 的例子

ALTER SEQUENCE emp_sequence

INCREMENT BY 10

MAXVALUE 10000

CYCLE -- 到10000后從頭開始

NOCACHE ;

影響Sequence的初始化參數:

SEQUENCE_CACHE_ENTRIES =設置能同時被cache的sequence數目。

可以很簡單的Drop Sequence

DROP SEQUENCE order_seq;

2.創建觸發器

--

CREATE OR REPLACE TRIGGER USERADD

BEFORE INSERT ON MEMBERRG

FOR EACH ROW

BEGIN

emp_sequence.NEXTVAL INTO :NEW.NUM FROM DUAL;

END;

但是如果數據庫表已經有數據了怎么辦呢?又不能重新去插數據觸發觸發器,這樣很繁瑣,怎么辦?

在表中增加一個列,為自增序列,然后執行:

update 表 set 自增序列=rownum;

這樣就把以前的3000多萬行都編號了,然后再用Sequence做序列;

OK,下來舉個具體的例子好了:

一、在Oracle中的沒有自動增長的數據類型,但可以使用序列(Sequence)代替。具體步驟如下:

1、 創建一個t_user的用戶表:

create table t_user(

id number primary key,

userName varchar2(15) not null unique,

userPass varchar2(20)

);

2、 創建一個序列seq_user_id:

create sequence seq_user_id

start with 1 –從1開始

increment by 1;--每次增量為1

3、 創建一個觸發器使給id 賦值:

create trigger tr_user_id

before

insert

on t_user

for each row

begin

select seq_user_id.nextval into :new.id from dual;

end;

insert into t_user (userName,userPass) values('handson','handson');

insert into t_user (userName,userPass) values('admin','admin');

接下來介紹一個通用一點的做法,使用存儲過程:

二、創建一個存儲過程來建立自動增長字段:

1、 Oracle中執行動態SQL時要顯示授權(即使該用戶擁有該相關權限)

grant create any sequence to scott;

grant create any trigger to scott;

2、建立一個創建自增字段的存儲過程

create or replace procedure pro_addIncrement(tableName in varchar2 , columnName in varchar2)

as

strsql varchar2(1000);

begin

strsql := 'create sequence seq_'||tableName||'_'||columnName||' start with 1 increment by 1';

execute immediate strsql;

strsql := 'create or replace trigger tr_'||tableName||'_'||columnName||' before insert on '||tableName||' for each row

begin

select seq_'||tableName||'_'||columnName||'.nextval into :new.'||columnName||' from dual;

end;';

execute immediate strsql;

end;

2、 調用存儲過程建立自增字段并測試

create table t_user(

id number primary key,

userName varchar2(20) not null unique,

userPass varchar2(20)

);

exec pro_addIncrement('t_user','id');

insert into t_user (userName,userPass) values('handson','handson');

insert into t_user (userName,userPass) values('admin','admin');

insert into t_user (userName,userPass) values('yangdongxin','pass');

insert into t_user (userName,userPass) values('java','java');

二:mysql

創建表t_user

create table t_user(

id int primary key auto_increment,--auto_increment表示自動增長,增量為1

userName varchar(15) not null unique,

userPass varchar(20)

);

insert into t_user (username,userPass) values(‘handson’,’handson’)

,(‘admin’,’admin’);

三:sql server

create table t_user(

id int primary key identity(1,1),

userName varchar(15) not null unique,

userPass varchar(20)

)

identity(begin,increment) begin:從哪一個位置開始。increment:表示每次增長的大小

insert into t_user (username,userPass) values(‘handson’,’handson’)

insert into t_user (username,userPass) values(‘admin’,’admin’)

總結

以上是生活随笔為你收集整理的sql oracle 自增长字段,在Oracle、MySQL、MS SQL Server中创设自动增长字段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。