在本教學中,將學習如何使用SQL Server IDENTITY
屬性向表中添加標識列。
SQL Server IDENTITY列簡介
要為表創建標識列,請使用IDENTITY
屬性,如下所示:
IDENTITY[(seed,increment)]
在上面語法中,
seed
是表中的第一行的值(第一條記錄標識列使用的值)。increment
是添加到上一行標識值的增量值。
seed
和increment
的默認值是1
,即(1,1)
。表示加載到表中的第一行的值為:1
,第二行的值為:2
(在上一行:1
的基礎上加1
),依此類推。
假設,希望第一行的標識列的值為10
,增量值為2
,可使用以下語法:
IDENTITY (10,2)
注:第一條記錄標識列的值是:10,第二條記錄標識列的值是:12,第三條記錄標識列的值為:14,依此類推。
請注意,SQL Server允許每個表只有一個標識列。
SQL Server IDENTITY示例
下麵創建一個名為hr
的新模式用來練習:
CREATE SCHEMA hr;
以下語句在個人標識號(person_id
)列上使用IDENTITY
屬性創建新表:
CREATE TABLE hr.person (
person_id INT IDENTITY(1,1) PRIMARY KEY,
first_name VARCHAR(50) NOT NULL,
last_name VARCHAR(50) NOT NULL,
gender CHAR(1) NOT NULL
);
首先,向person
表中插入一個新行:
INSERT INTO hr.person(first_name, last_name, gender)
OUTPUT inserted.person_id
VALUES('Max','Su', 'M');
輸出結果如下:
從輸出中可以清楚地看到,第一行在person_id
列中加載的值為:1
。
接下來,再向person
表中插入另一行:
INSERT INTO hr.person(first_name, last_name, gender)
OUTPUT inserted.person_id
VALUES('Mini','Su','F');
輸出結果如下:
從輸出中可以清楚地看到,第二行在person_id
列中的值為:2
。
重用標識值
SQL Server不能重用標識值。 如果在標識列中插入行並且執行insert
語句失敗或回滾,則標識值將丟失,並且不會再次生成。這會導致標識列中出現空白。
看看以下一個示例。
首先,在hr
模式中再創建兩個表:position
和person_position
:
CREATE TABLE hr. POSITION (
position_id INT IDENTITY (1, 1) PRIMARY KEY,
position_name VARCHAR (255) NOT NULL,
);
CREATE TABLE hr.person_position (
person_id INT,
position_id INT,
PRIMARY KEY (person_id, position_id),
FOREIGN KEY (person_id) REFERENCES hr.person (person_id),
FOREIGN KEY (position_id) REFERENCES hr. POSITION (position_id)
);
其次,插入一個新的人員資訊並在person_position
表中插入一個新記錄,為新人員分配一個位置:
BEGIN TRANSACTION
BEGIN TRY
-- 插入一個新人員記錄
INSERT INTO hr.person(first_name,last_name, gender)
VALUES('Max','Su','F');
-- 分配一個位置
INSERT INTO hr.person_position(person_id, position_id)
VALUES(@@IDENTITY, 1);
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
在此示例中,第一個insert
語句已成功執行。 但是,由於在person_position
表中沒有id
值為1
的位置,第二個插入語句失敗了。 由於失敗,整個事務被回滾。
因為第一個INSERT
語句使用了三個標識值並且事務被回滾,所以下一個標識值將為:4
,如以下語句所示:
INSERT INTO hr.person(first_name,last_name,gender)
OUTPUT inserted.person_id
VALUES('Peter','Drucker','F');
輸出結果如下:
在本教學中,學習了如何使用SQL Server IDENTITY
屬性為表創建標識列。