第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
慕課專欄

目錄

索引目錄

10+年DBA老司機帶你輕松玩轉(zhuǎn) SQL

原價 ¥ 48.00

立即訂閱
15 學(xué)生信息表自增字段的使用
更新時間:2020-09-14 14:39:07
讀一本好書,就是和許多高尚的人談話。——歌德

我們在設(shè)計數(shù)據(jù)表時,使用自動增長字段可以簡化字段數(shù)據(jù)的生成,在開發(fā)實踐中,經(jīng)常將主鍵設(shè)置為自動增長字段,不同的數(shù)據(jù)庫自動增長字段實現(xiàn)是不同的,下面我們一起來詳細了解。

15.1 MySQL 中使用自增字段

首先了解下怎么在 MySQL 中創(chuàng)建自增字段,在 MySQL 中創(chuàng)建自增字段比較簡單,只需要在字段后面加上 auto_increment 即可:

create table t_test(id int primary key auto_increment, name varchar(20))

上面例句創(chuàng)建了測試表 t_test,表中字段 id 被設(shè)置為自動增長的主鍵,它的默認初始值 1 且步長為 1。使用下面的語句向 t_test 表中插入數(shù)據(jù):

  insert into t_test (name)  values('a');
  insert into t_test (name) values('b')

通過查詢語句查詢插入后的數(shù)據(jù):

select * from t_test

結(jié)果集:

圖片描述

從結(jié)果可以看出,雖然上面 insert 語句沒有向主鍵 id 字段插入數(shù)據(jù),但數(shù)據(jù)庫自動向 id 字段插入數(shù)據(jù),數(shù)據(jù)為初始值為 1 步長為 1 的值。

如果希望自己設(shè)定表的自增字段初始值,可以使用下面的 SQL 來完成:

ALTER TABLE t_test   AUTO_INCREMENT = 5

例句中的 5 是自己設(shè)置的,而且需要大于自增字段 id 的當前最大值 2,如果小于則無效。執(zhí)行上面SQL 后,當再次向表中新增數(shù)據(jù)時:

insert into t_test (name)  values('c');
select * from t_test

結(jié)果集:

圖片描述

id 的值從 5 開始自增。如果希望修改自增步長,MySQL 數(shù)據(jù)庫還提供了系統(tǒng)參數(shù) auto_increment_increment 來控制自增步長,以方便進行個性化的設(shè)置。現(xiàn)在我們執(zhí)行下面的SQL語句:

SET session auto_increment_increment=2; 
insert into t_test (name) values('d'); select * from t_test

上面SQL語句中SET session auto_increment_increment=2 將本會話中的自增長步長修改為2,然后向表中新增一條記錄,從執(zhí)行結(jié)果看,表t_test的id從5增長到了7,說明步長變成了2。

結(jié)果集:

圖片描述

15.2 SQLServer 中使用自增字段

在 SQLServer 中為一個字段設(shè)置自動增長也比較簡單,只需要指定字段為 IDENTITY 即可,比如我們在SQLServer 中創(chuàng)建 t_test 表:

create table t_test(id   int   PRIMARY KEY IDENTITY(1,1), name nvarchar(20))

在建表語句 IDENTITY(1,1) 中的第一個參數(shù)值 1 表示初始值為 1,第二個參數(shù)值 1 代表步長為 1。新增兩條記錄:

insert into t_test (name)  values('a');
insert into t_test (name) values('b'); 
select * from  t_test

結(jié)果集:

圖片描述

和 MySQL 的效果一樣,id 字段按照初始值為 1 步長為 1 的規(guī)則自動填充數(shù)據(jù)。SQLServer 提供了修改自增字段初始值的方法:

DBCC CHECKIDENT ('t_test', RESEED, 10) 

語句中參數(shù) 10 是設(shè)置值,該值必須大于自增字段的最大值,否則新增記錄時會報出 id 重復(fù)的錯誤提示。

15.3 Oracle 中使用自增字段

上面我們講解了如何在 MySQL 和 SQLServer 中使用自增字段,還是比較簡單的,但是在 Oracle 中使用自增字段就稍微有點麻煩了,由于沒有像 MySQL 那樣的 auto_increment 的屬性標識,所以需要手工創(chuàng)建序列 sequence,首先創(chuàng)建一張表:

create table t_test(id   number  , name varchar2(20))

并為該表創(chuàng)建一個對應(yīng)的序列:

create sequence t_test_id_seq
increment by 1
start with 1
nomaxvalue
nominvalue
nocache
  • increment by:指定了自增步長為1;

  • start with:指定了初始值為1;

  • Maxvalue:用于指定序列生成器可以生成的最大序列號(必須大于或等于start with,并且必須大于 minvalue),默認為 nomaxvalue;

  • Minvalue:用于指定序列生成器可以生成的最小序列號(必須小于或等于start with,并且必須小于maxvalue),默認值為 nominvalue;

  • Cache:用于指定在內(nèi)存中可以預(yù)分配的序列號個數(shù)(默認值:20),設(shè)置 nocache 表示不預(yù)分配。

create or replace trigger tr_t_test
before insert on t_test
for each row
begin
select t_test_id_seq.nextval into :new.id from dual;
end;

進行上面的設(shè)置后,在使用 insert 語句向表 t_test 新增數(shù)據(jù)后,id 字段就會自動填充數(shù)據(jù)。

在 Oracle 中可以通過下面 SQL 修改序列的步長:

alter sequence t_test_id_seq increment by 5 

但要修改序列初始值就沒有這么簡單了,需要通過修改步長來解決,若序列 t_test_id_seq 現(xiàn)值是2,需要設(shè)置初始值為 100,Increment By 值為 98(100-2)。

 alter sequence t_test_id_seq increment by 98;
 select t_test_id_seq.nextval from dual;
 alter sequence t_test_id_seq increment by 1;

上面的SQL語句中 alter sequence t_test_id_seq increment by 98 將自增步長修改為98,
第二條語句執(zhí)行select t_test_id_seq.nextval from dual 做一次查詢,使初始值增加到100(98+2),最后再自增步長修改回1,這樣序列就可以以100為初始值、以自增步長為1進行增長了。

15.4 PostgreSQL 中使用自增字段

在 PostgreSQL 通過使用序列 sequence 來標識字段實現(xiàn)字段的自動增長,序列數(shù)據(jù)類型有 smallserial、serial 和 bigserial,他們之間主要是數(shù)值范圍和存儲大小的差異。一般使用 serial(數(shù)值范圍:1 到 2,147,483,647)就可以滿足我們?nèi)粘5男枰?。以下表格展示了smallserial、serial 和 bigserial 在數(shù)據(jù)范圍和存儲大小之間的差異:

結(jié)果集:

圖片描述

create table t_test(id  serial NOT NULL, name varchar(20))

上面 SQL 語句在 PostgreSQL 中使用 serial 創(chuàng)建了一張以 id 為自增的表,數(shù)據(jù)庫也會自動創(chuàng)建以tablename_id_seq(本例中應(yīng)為:t_test_id_seq)命名的序列。

現(xiàn)在向表中新增數(shù)據(jù),并查詢新增的記錄:

insert into t_test (name)  values('a');
insert into t_test (name) values('b'); 
select * from  t_test

結(jié)果集:

圖片描述

新增數(shù)據(jù)時,數(shù)據(jù)庫為 id 字段自動填充了數(shù)據(jù),且初始值為 1,步長為 1。那么在 PostgreSQL 如何修改序列的初始值呢,數(shù)據(jù)庫提供了下面 SQL 語句:

select setval('t_test_id_seq',10,false)

修改序列的初始值為 10 后,再次向表中新增一條記錄并查看結(jié)果:

  insert into t_test (name) values('c'); 
  select * from  t_test

結(jié)果集:

圖片描述

新增的記錄中 id 就會從 10 開始填充,而不是按照原來的順序填寫為 3。值得注意的是修改序列的初始值時,設(shè)置值一定要大于當前的最大值,否則會導(dǎo)致向 id 插入重復(fù)值而報錯。至于修改序列的步長,我們可以通過下面 SQL 語句實現(xiàn):

 alter sequence t_test_id_seq increment by 5

上面語句執(zhí)行后,序列 t_test_id_seq 的步長變?yōu)?5。當我們再向表中添加新記錄時,新增的id為15,說明自增步長已經(jīng)修改為5了。

insert into t_test (name) values('d'); 
select * from  t_test

結(jié)果集:

圖片描述

MySQL Oracle SQLServer PostgreSQL 四種數(shù)據(jù)庫以各自獨有的方式實現(xiàn)了自增字段的設(shè)置,
其中MySQL、SQLServer 和 PostgreSQL 是給列設(shè)置屬性實現(xiàn)字段的自增,Oracle是通過創(chuàng)建序列并綁定字段來實現(xiàn)字段自增的,雖然復(fù)雜但也靈活,可以根據(jù)具體需求配置自增初始值和步長。

15.5 小結(jié)

盡管自增字段給我們帶來了很多方便,比如自增字段為數(shù)據(jù)庫自動生成值,性能較高。由于該字段為數(shù)值型,占用空間小,容易創(chuàng)建索引及排序等等。

但自動字段的使用也存在一些缺點,比如當我們準備手動插入特定ID(非數(shù)據(jù)庫自動生成)就比較麻煩,特別是在兩張表合并成一張表時,ID之間的重復(fù)值處理就顯得更不方便。所以在項目中需要結(jié)合實際場景綜合考慮是否考慮使用自增字段,雖然在大部分場景下還是建議使用的。

}
立即訂閱 ¥ 48.00

你正在閱讀課程試讀內(nèi)容,訂閱后解鎖課程全部內(nèi)容

千學(xué)不如一看,千看不如一練

手機
閱讀

掃一掃 手機閱讀

10+年DBA老司機帶你輕松玩轉(zhuǎn) SQL
立即訂閱 ¥ 48.00

舉報

0/150
提交
取消