1. 程式人生 > 其它 >SQL學習筆記----第二天(學生資訊表自增欄位的使用)

SQL學習筆記----第二天(學生資訊表自增欄位的使用)

技術標籤:sql學習sql資料庫mysql

學生資訊表自增欄位的使用--目錄

前言

我們在設計資料表時,使用自動增長欄位可以簡化子彈資料的生成,在開發實踐中,經常將主鍵設定為自動增長欄位,不同的資料庫自動增長欄位實現是不同的,下面我們來一起詳細瞭解下


一、MySQL中使用自增欄位

首先了解下怎麼在MySQL中建立自增欄位,在MySQL中建立自增欄位,在MySQL中建立自增欄位比較簡單,只需要在欄位後面加上auto_increment 即可:

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

上面例句建立了測試表t_test,表中欄位id 被設定為自動增長的主鍵,它的預設初始值1且步長為1。使用下面的語句向t_test表中插入大資料:

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

通過查詢語句查詢插入後的資料:

select * from t_test;

結果集:
在這裡插入圖片描述
從結果可以看出,雖然上面insert語句沒有向主鍵id欄位插入資料,但是資料庫自動向id欄位插入資料,資料初始值為1,步長為1的值。

如果希望自己來設定表的自增欄位初始值,可以用下面的SQL來完成:

ALTER TABLE t_test AUTO_INCREMENT = 5;

例句中的5是自己設定的,而且需要大於自增欄位id的當前最大值2,如果小於則無效。執行上面SQL後,當再次向表中新增資料時:

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

結果集:
在這裡插入圖片描述
id的值從5開始自增。如果希望修改自增步長,MySQL資料庫還提供了系統引數auto_increment_increment來控制自增步長,以方便進行個性化的設定。現在我們執行下面的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,然後向表中新增一條記錄,從執行結果來看,表t_test的id從5增到了7,說明步長變成了2.
結果集:
在這裡插入圖片描述

二、SqlServer中使用自增欄位

在SQLServer中為一個欄位設定自動增長也比較簡單,只需要指定欄位為IDENTITY即可,比如我們在SQLServer中建立t_test表:

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

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

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

結果集:
在這裡插入圖片描述
和MySQL的效果一樣。id欄位按照初始值為1和步長為1的規則自動填充資料。SQLServer提供了修改自增欄位初始值的方法:

DBCC CHECKOUT('t_test',RESEED.10)

語句中引數10是設定值,該值必須大於自增欄位的最大值,否則記錄時會報出Id重複的錯誤提示。

三、Oracle中使用自增欄位

上面我們說了如何在MySQL和SQLServer中使用自增欄位,還是比較簡單的,但是在Oracle中使用自增欄位就稍微有點麻煩了,由於沒有像MySQL那樣的auto_increment的屬性標識,所以需要手工建立序列sequence,首先建立一張表:

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

併為該表建立一個對應的序列:

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),預設為 no maxvalue
  • Minvalue:用於指定序列生成器可以生成的最小序列號(必須小於或等於start with,並且小於maxvalue),預設值為:nominvalue
  • Cache:用於指定在記憶體中可以預分配的序列號個數(預設值是20),設定nocache表示不預分配
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;

進行上面的設定後,在使用insert語句向表的t_test新增資料後,id欄位就會自動填充資料。
在Oracle中可以通過下面SQL修改序列的步長:

alter sequence t_test_id_seq increment by 5

但要修改序列初始值就沒有這麼簡單了,需要通過修改步長來解決,若序列t_test_id_seq 現值是2,需要設定初始值為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;
第二條語句執行select t_test_id_seq.nextval from dual做一次查詢,使初始值增加到100(98+2),最後在自增步長修改回1、這樣序列就可以以100為初始值、以自增步長為1進行增長了

總結

MySQL,SQLServer,Oracle三種資料庫以各自獨有的方式實現了自增欄位的設定,其中MySQL、SQLServer是給列設定屬性實現欄位的自增,Oracle是通過建立序列並繫結欄位來實現欄位自增的,雖然有些複雜,但是也很靈活,可以根據具體需求配置自增初始值和步長。

儘管自增欄位給我們帶來了很多方便,比如自增欄位為資料庫自動生成值、效能較高。由於該欄位為數值型,佔用空間小,容易建立索引和排序等。

但是自動欄位的使用也存在一些缺點,比如當我們準備手動插入特定ID(非資料庫自動生成)就比較麻煩,特別是兩張表合併成一個表時,ID之間的重複值處理就顯得更不方便。所以專案中需要結合實際場景綜合考慮使用自增欄位,雖然在大部分的場合還是建議使用的。