Ana içeriğe geç
Kesit SQL
Orta · T-SQL (SQL Server)

SEQUENCE, IDENTITY ve anahtar üretimi

Otomatik numaralar: IDENTITY, SEQUENCE, SCOPE_IDENTITY ve GUID.

Uygulamada aç, 5 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Otomatik numara üretmenin yolları

YöntemNerede?Özellik
IDENTITY(1,1)Tek bir tablonun sütunuSatır eklenince otomatik artar.
SEQUENCEBağımsız bir nesne (2012+)Birden çok tablo paylaşabilir; değeri satırı eklemeden önce alabilirsin.
NEWID() / NEWSEQUENTIALID()UNIQUEIDENTIFIER sütunuDünyada tekil GUID; sistemler arası birleştirmede işe yarar ama indekste parçalanmaya yol açar.

SEQUENCE

CREATE SEQUENCE dbo.fatura_no AS INT
    START WITH 1000
    INCREMENT BY 1;

SELECT NEXT VALUE FOR dbo.fatura_no AS ilk;
SELECT NEXT VALUE FOR dbo.fatura_no AS ikinci;
START WITH'i unutmaSQL Server'da START WITH yazılmazsa sıra, veri tipinin en küçük değerinden başlar: INT için −2.147.483.648. Bu yaygın bir sürprizdir. PostgreSQL ve Oracle'da varsayılan başlangıç 1'dir.

Toplu eklemede sıra kullanmak

CREATE SEQUENCE dbo.fatura_no AS INT START WITH 1000 INCREMENT BY 1;
CREATE TABLE #fatura (fatura_no INT, order_id INT);

INSERT INTO #fatura (fatura_no, order_id)
SELECT NEXT VALUE FOR dbo.fatura_no, order_id
FROM orders
WHERE order_date = '2024-12-31';

SELECT * FROM #fatura;

Tabloda varsayılan değer olarak da tanımlanabilir: fatura_no INT DEFAULT (NEXT VALUE FOR dbo.fatura_no).

KısıtlamaNEXT VALUE FOR; TOP veya OFFSET içeren sorgularda, alt sorgularda ve CTE'lerde kullanılamaz.

Numaralarda boşluk olur

Sıra numarası verildikten sonra işlem geri alınsa bile o numara geri gelmez. Bu, eşzamanlı kullanıcılar birbirini beklemesin diye bilinçli bir tasarımdır. Fatura numarasında boşluk yasal olarak sorunsa, numara ayrı ve kilitli bir tabloyla verilir.

CREATE SEQUENCE dbo.s AS INT START WITH 1 INCREMENT BY 1;

BEGIN TRAN;
    SELECT NEXT VALUE FOR dbo.s AS geri_alinan;
ROLLBACK;

SELECT NEXT VALUE FOR dbo.s AS sonraki;  -- 2 gelir, 1 kayboldu

Eklenen satırın numarası

FonksiyonDöndürdüğü
SCOPE_IDENTITY()Aynı oturum ve aynı kapsamda üretilen son IDENTITY. Doğru seçim budur.
@@IDENTITYOturumdaki son IDENTITY; bir trigger başka tabloya eklediyse onun numarasını döndürür.
IDENT_CURRENT('tablo')Tablonun son numarası, herhangi bir oturumdan.
OUTPUT inserted.idÇok satırlı eklemede tüm yeni numaralar.

Diğer SQL türleri: PostgreSQL'de GENERATED ALWAYS AS IDENTITY ve RETURNING id, MySQL'de AUTO_INCREMENT ve LAST_INSERT_ID(), Oracle'da GENERATED AS IDENTITY veya sequence kullanılır.

Alıştırmalara geç (5)