IDENTITY (Özellik) (Transact-SQL)
Bir tabloda bir kimlik sütunu oluşturur. Bu özellik CREATE TABLE ve ALTER TABLE Transact-SQL deyimleriyle kullanılır.
[!NOT]
IDENTITY özelliği, bir sütunun kimlik özelliğini dışa açan SQL-DMO Identity özelliğinden farklıdır.
Transact-SQL Sözdizim Kuralları
Sözdizimi
IDENTITY [ (seed , increment) ]
Bağımsız değişkenler
seed
Tabloya yüklenen ilk satır için kullanılan değerdir.increment
Yüklenen bir önceki satırın kimlik değerine eklenen artım değeridir.
Hem kök hem de artım değerini belirtmeli veya hiçbirini belirtmemelisiniz. Hiçbiri belirtilmezse, varsayılan değer (1,1) olur.
Açıklamalar
Sık sık silme yapılan bir tabloda bir kimlik sütunu varsa, kimlik değerleri arasında boşluklar oluşabilir. Bu bir sorun oluşturuyorsa, IDENTITY özelliğini kullanmayın. Ancak, boşluk oluşmamasını sağlamak veya var olan boşlukları doldurmak için, SET IDENTITY_INSERT ON olarak açıkça bir tane girmeden önce var olan kimlik değerlerini çağırın.
Kaldırılmış bir kimlik değerini yeniden kullanıyorsanız, kullanılabilen bir sonraki kimlik değerini aramak için Örnek B'deki örnek kodu kullanın. tablename, column_type ve MAX(column_type) - 1 ifadelerini bir tablo adı, kimlik sütunu veri türü ve (o veri türü için) izin verilen en yüksek sayısal değer -1 ile değiştirin.
Geçerli kimlik değerini denetlemek ve kimlik sütunundaki en yüksek değer ile karşılaştırmak için DBCC CHECKIDENT'i kullanın.
Kimlik sütunu olan bir tablo çoğaltma için yayımlanırsa, kimlik değerinin kullanılan çoğaltma türüne uygun olan bir şekilde yönetilmesi gerekir. Daha fazla bilgi için, bkz. Kimlik sütunları çoğaltma.
[!NOT]
Birden çok tabloda kullanılabilecek ve herhangi bir tabloya başvurmadan uygulamalardan çağrılabilecek, otomatik olarak artan bir sayı oluşturma için bkz. Sıra numaraları.
Örnekler
A.IDENTITY özelliğini CREATE TABLE ile kullanma
Aşağıdaki örnek, otomatik olarak artan bir kimlik numarası için IDENTITY özelliğini kullanarak yeni bir tablo oluşturmaktadır.
USE AdventureWorks2012
IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL
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');
USE AdventureWorks2012
IF OBJECT_ID ('dbo.new_employees', 'U') IS NOT NULL
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.Kimlik değerlerinde boşluklar bulmak için genel amaçlı sözdizimi kullanma
Aşağıdaki örnek, veri çıkarıldığında kimlik değerlerinde oluşan boşlukları bulmak için genel amaçlı sözdizimini göstermektedir.
[!NOT]
Aşağıdaki Transact-SQL komut dizisinin ilk kısmı yalnızca örnek olarak hazırlanmıştır. -- Create the img table yorumu ile başlayan Transact-SQL komut dizisini çalıştırabilirsiniz.
-- Here is the generic syntax for finding identity value gaps in data.
-- The illustrative example starts here.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @maxidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)
FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
FROM tablename t1
WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND
@maxidentval AND
NOT EXISTS (SELECT * FROM tablename t2
WHERE t2.$IDENTITY = t1.$IDENTITY +
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 OBJECT_ID ('dbo.img', 'U') IS NOT NULL
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($IDENTITY) FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
FROM img t1
WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND
NOT EXISTS (SELECT * FROM img t2
WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))
ELSE
SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF
-- Here is the generic syntax for finding identity value gaps in data.
-- The illustrative example starts here.
SET IDENTITY_INSERT tablename ON
DECLARE @minidentval column_type
DECLARE @maxidentval column_type
DECLARE @nextidentval column_type
SELECT @minidentval = MIN($IDENTITY), @maxidentval = MAX($IDENTITY)
FROM tablename
IF @minidentval = IDENT_SEED('tablename')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('tablename')
FROM tablename t1
WHERE $IDENTITY BETWEEN IDENT_SEED('tablename') AND
@maxidentval AND
NOT EXISTS (SELECT * FROM tablename t2
WHERE t2.$IDENTITY = t1.$IDENTITY +
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 OBJECT_ID ('dbo.img', 'U') IS NOT NULL
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($IDENTITY) FROM img
IF @minidentval = IDENT_SEED('img')
SELECT @nextidentval = MIN($IDENTITY) + IDENT_INCR('img')
FROM img t1
WHERE $IDENTITY BETWEEN IDENT_SEED('img') AND 32766 AND
NOT EXISTS (SELECT * FROM img t2
WHERE t2.$IDENTITY = t1.$IDENTITY + IDENT_INCR('img'))
ELSE
SELECT @nextidentval = IDENT_SEED('img')
SET IDENTITY_INSERT img OFF
Ayrıca bkz.
Başvuru
DBCC CHECKIDENT (Transact-SQL)
IDENTITY (işlev) (Transact-sql)
SET IDENTITY_INSERT (Transact-SQL)