日韩性视频-久久久蜜桃-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中创设自动增长字段的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 自拍偷拍另类 | 亚洲网站在线免费观看 | 新91在线| 国外成人在线视频 | 国产又黄又猛又爽 | 国产女在线 | www.在线播放| 狠狠干在线视频 | 精品国产乱码久久久久久预案 | 清纯唯美激情 | av免费在线观看网址 | 国产精品一区二区电影 | 精品人妻一区二区三区四区在线 | 青草青草视频 | 扒开腿揉捏花蒂h | 成人影音在线 | 国产一区二区三区四区精 | 四虎影院在线视频 | 欧美色涩| 欧美日韩aa| 后进极品美女圆润翘臀 | 被警察猛c猛男男男 | 精品日本一区二区三区在线观看 | 在线色网站 | 自拍第一区 | 超碰女| 久久首页 | 玖色视频 | 亚洲精品123区| 日本欧美日韩 | 91精品国产综合久久精品 | 性猛交ⅹxxx富婆视频 | 精品久久福利 | jlzzjlzz亚洲日本少妇 | 亚洲中文字幕一区 | 黑人三级视频 | 九九九热精品 | 精品国产精品网麻豆系列 | 在线免费av片 | 成人交性视频免费看 | 美女的胸给男人玩视频 | 亚a在线| 日韩成人免费在线视频 | 久久精品国产免费看久久精品 | 超碰青娱乐 | 精品亚洲乱码一区二区 | 肥老熟妇伦子伦456视频 | 日韩日日日 | 老女人网站 | 日本乱淫视频 | 九色蝌蚪9l视频蝌蚪9l视频 | 欧美第一页草草影院 | 欧美成网站| 国产极品在线播放 | 小香蕉影院 | 国产xxxxwwww | 波多野结衣先锋影音 | 青青av在线| 欧美一区二区在线视频 | 色吧婷婷 | 欧美成人吸奶水做爰 | 福利精品视频 | 久草福利视频 | 草1024榴社区成人 | 秋霞欧美在线观看 | 精品少妇人妻av一区二区 | 日本高清视频在线观看 | 日韩国产在线观看 | 91麻豆免费视频 | 亚洲欧洲日产av | wwwww国产 | 国产精品久久久久久久9999 | 网友自拍视频 | 一区国产精品 | 亲子伦视频一区二区三区 | 视频在线91 | 教练含着她的乳奶揉搓揉捏动态图 | 久一视频在线观看 | 欧美极品一区二区三区 | 殴美一级黄色片 | 一区二区三区久久久久 | 天天免费视频 | 久久久久久久久久久久久女过产乱 | 成人在线视频网址 | 国外成人在线视频 | 毛片aaaaaa| 77777av| 一区二区三区在线观 | 午夜精品免费观看 | 国产在线二区 | 久久不卡影院 | 天堂网2014| www.亚洲激情 | 国产suv一区二区 | 强开乳罩摸双乳吃奶羞羞www | 国产精品午夜福利视频234区 | 黄色一级在线观看 | 亚洲av少妇一区二区在线观看 | 东北女人av |