Otomatik numara üretmenin yolları
| Yöntem | Nerede? | Özellik |
|---|---|---|
IDENTITY(1,1) | Tek bir tablonun sütunu | Satır eklenince otomatik artar. |
SEQUENCE | Bağımsız bir nesne (2012+) | Birden çok tablo paylaşabilir; değeri satırı eklemeden önce alabilirsin. |
NEWID() / NEWSEQUENTIALID() | UNIQUEIDENTIFIER sütunu | Dü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ı
| Fonksiyon | Döndürdüğü |
|---|---|
SCOPE_IDENTITY() | Aynı oturum ve aynı kapsamda üretilen son IDENTITY. Doğru seçim budur. |
@@IDENTITY | Oturumdaki 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.