SQL SERVER中利用IDENTITY屬性建立自動ID列
阿新 • • 發佈:2019-01-03
DENTITY(屬性)
在表中建立一個標識列。該屬性與 CREATE TABLE 及 ALTER TABLE Transact-SQL 語句一起使用。
說明 IDENTITY 屬性與 SQL-DMO Identity 屬性不同,後者表現列的行標識屬性。
語法
IDENTITY [ ( seed , increment ) ]
引數
seed 裝載到表中的第一個行所使用的值。
increment 增量值,該值被新增到前一個已裝載的行的標識值上。
必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取預設值 (1,1)。
註釋
如果在經常進行刪除操作的表中存在著標識列,那麼在標識值之間可能會產生差距。如果這構成了問題,那麼請不要使用 IDENTITY 屬性。但是,為了確保未產生差距,或者為了彌補現有的差距,在用 SET IDENTITY_INSERT ON 顯式地輸入標識值之前,請先對現有的標識值進行計算。
如果重新使用已刪除的標識值,那麼請使用示例 B 中的示例程式碼進行檢查,以獲得下一個可用的標識值。請用您的表名、標識列資料型別以及(該資料型別的)最大可允許值的數值 –1 替換 tablename、column_type 和 max(column_type) – 1。
使用 DBCC CHECKIDENT 檢查當前的標識值,並將其與標識列中的最大值進行比較。
當將 IDENTITY 屬性與 CREATE TABLE 一起使用時,SQL Server使用 CREATE TABLE 的 NOT FOR REPLICATION 選項替代標識列的自動增加。通常,SQL Server 給插入表中的每個新行指派一個值,該值比前面的最高值要大出某些增量。但是,如果新行是由另一個數據源複製過來的,那麼標識值必須保持與其在資料來源中完全相同。
示例
A. 將 IDENTITY 屬性與 CREATE TABLE 一起使用
下面的示例建立一個新表,該表將 IDENTITY 屬性用於獲得自動增加的標識號。
USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'new_employees')
DROP TABLE new_employees
GO
CREATE TABLE new_employees
(
id_num int IDENTITY(1,1),
fname varchar (20),
minit char(1),
lname varchar(30)
)
INSERT new_employees
(fname, minit, lname)
VALUES
('Karin', 'F', 'Josephs')
INSERT new_employees
(fname, minit, lname)
VALUES
('Pirkko', 'O', 'Koskitalo')
B. 使用一般語法查詢標識值中的差距
下面的示例顯示一般的語法,當刪除資料時,可以使用該語法查詢標識值中的差距。
說明 下面的 Transact-SQL 指令碼中的第一部分只用作示範說明。可以執行以下面的註釋開始的 Transact-SQL 指令碼:- - Create the img table.
-- Here is the generic syntax for finding identity value gaps in data.
-- This is the beginning of the illustrative example.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN(IDENTITYCOL) FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('tablename')
FROM tablename t1
WHERE IDENTITYCOL BETWEEN IDENT_SEED('tablename') AND
MAX(column_type) AND
NOT EXISTS (SELECT * FROM tablename t2
WHERE t2.IDENTITYCOL = t1.IDENTITYCOL +
IDENT_INCR('tablename'))
ELSE
SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column
-- called id_num, which is an increasing identification number, and the
-- second column called company_name.
-- This is the end of the illustration example.
-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'img')
DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON
DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN(IDENTITYCOL) FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('img')
FROM img t1
WHERE IDENTITYCOL BETWEEN IDENT_SEED('img') AND 32766 AND
NOT EXISTS (SELECT * FROM img t2
WHERE t2.IDENTITYCOL = t1.IDENTITYCOL + IDENT_INCR('img'))
ELSE
SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF
在表中建立一個標識列。該屬性與 CREATE TABLE 及 ALTER TABLE Transact-SQL 語句一起使用。
說明 IDENTITY 屬性與 SQL-DMO Identity 屬性不同,後者表現列的行標識屬性。
語法
IDENTITY [ ( seed , increment ) ]
引數
seed 裝載到表中的第一個行所使用的值。
increment 增量值,該值被新增到前一個已裝載的行的標識值上。
必須同時指定種子和增量,或者二者都不指定。如果二者都未指定,則取預設值 (1,1)。
註釋
如果在經常進行刪除操作的表中存在著標識列,那麼在標識值之間可能會產生差距。如果這構成了問題,那麼請不要使用 IDENTITY 屬性。但是,為了確保未產生差距,或者為了彌補現有的差距,在用 SET IDENTITY_INSERT ON 顯式地輸入標識值之前,請先對現有的標識值進行計算。
如果重新使用已刪除的標識值,那麼請使用示例 B 中的示例程式碼進行檢查,以獲得下一個可用的標識值。請用您的表名、標識列資料型別以及(該資料型別的)最大可允許值的數值 –1 替換 tablename、column_type 和 max(column_type) – 1。
使用 DBCC CHECKIDENT 檢查當前的標識值,並將其與標識列中的最大值進行比較。
當將 IDENTITY 屬性與 CREATE TABLE 一起使用時,SQL Server使用 CREATE TABLE 的 NOT FOR REPLICATION 選項替代標識列的自動增加。通常,SQL Server 給插入表中的每個新行指派一個值,該值比前面的最高值要大出某些增量。但是,如果新行是由另一個數據源複製過來的,那麼標識值必須保持與其在資料來源中完全相同。
示例
A. 將 IDENTITY 屬性與 CREATE TABLE 一起使用
下面的示例建立一個新表,該表將 IDENTITY 屬性用於獲得自動增加的標識號。
USE pubs
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'new_employees')
DROP TABLE new_employees
GO
CREATE TABLE new_employees
(
id_num int IDENTITY(1,1),
fname varchar (20),
minit char(1),
lname varchar(30)
)
INSERT new_employees
(fname, minit, lname)
VALUES
('Karin', 'F', 'Josephs')
INSERT new_employees
(fname, minit, lname)
VALUES
('Pirkko', 'O', 'Koskitalo')
B. 使用一般語法查詢標識值中的差距
下面的示例顯示一般的語法,當刪除資料時,可以使用該語法查詢標識值中的差距。
說明 下面的 Transact-SQL 指令碼中的第一部分只用作示範說明。可以執行以下面的註釋開始的 Transact-SQL 指令碼:- - Create the img table.
-- Here is the generic syntax for finding identity value gaps in data.
-- This is the beginning of the illustrative example.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN(IDENTITYCOL) FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('tablename')
FROM tablename t1
WHERE IDENTITYCOL BETWEEN IDENT_SEED('tablename') AND
MAX(column_type) AND
NOT EXISTS (SELECT * FROM tablename t2
WHERE t2.IDENTITYCOL = t1.IDENTITYCOL +
IDENT_INCR('tablename'))
ELSE
SELECT @nextidentval = IDENT_SEED('tablename')
SET IDENTITY_INSERT tablename OFF
-- Here is an example to find gaps in the actual data.
-- The table is called img and has two columns: the first column
-- called id_num, which is an increasing identification number, and the
-- second column called company_name.
-- This is the end of the illustration example.
-- Create the img table.
-- If the img table already exists, drop it.
-- Create the img table.
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'img')
DROP TABLE img
GO
CREATE TABLE img (id_num int IDENTITY(1,1), company_name sysname)
INSERT img(company_name) VALUES ('New Moon Books')
INSERT img(company_name) VALUES ('Lucerne Publishing')
-- SET IDENTITY_INSERT ON and use in img table.
SET IDENTITY_INSERT img ON
DECLARE @minidentval smallint
DECLARE @nextidentval smallint
SELECT @minidentval = MIN(IDENTITYCOL) FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN(IDENTITYCOL) + IDENT_INCR('img')
FROM img t1
WHERE IDENTITYCOL BETWEEN IDENT_SEED('img') AND 32766 AND
NOT EXISTS (SELECT * FROM img t2
WHERE t2.IDENTITYCOL = t1.IDENTITYCOL + IDENT_INCR('img'))
ELSE
SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF