SQL Server

IDENTITY sloupec se záporným inkrementem

Kromě klasického nastavení IDENTITY(1,1), tedy inkrementace od jedničky a vždy o +1, můžeme nastavit inkrement i záporný, tedy vždy odečítat jedničku, jak je vidět v příkladu níže.

CREATE TABLE dbo.SampleTable
(
    Id INT IDENTITY(0, -1) NOT NULL PRIMARY KEY
)
GO

INSERT dbo.SampleTable
    DEFAULT VALUES
GO 5

SELECT * FROM dbo.SampleTable
GO

IdentityWithNegativeIncrement

Kromě záporného inkrementu může nastavit i zápornou výchozí hodnotu prvního záznamu, například takto:

CREATE TABLE dbo.SampleTable
(
    Id SMALLINT IDENTITY(-32768, 1) NOT NULL PRIMARY KEY
)
GO

INSERT INTO dbo.[SampleTable]
	DEFAULT VALUES
GO 5

SELECT * FROM dbo.[SampleTable]
GO

NegativeIdentitySeed

Záporná výchozí hodnota nám přináší obrovskou výhodu pro scénáře, kdy pracujeme například s rozsáhlými faktovými tabulkami a snažíme se ušetřit velikost uložených dat tím, že dimenzionální klíče budou mít co nejmenší datový typ, např. tiny nebo smallint. Pokud ale například počet členů naší dimenze bude někde mezi 30 a 60 tisíci, napadne nás, že již nemůžeme použít smallint datový typ, protože jeho maximální hodnota je 32,767. To ale není pravda, pokud si uvědomíme, že jeho minimální hodnota je -32,768, takže celkem včetně nuly lze do tohoto datového typu uložit 65,535 hodnot. A právě nastavením identity sloupce s výchozí hodnotou -32768 můžeme celý tento rozsah vyčerpat.

Hodnoty klíčů s negativním znamínkem můžou být pochopitelně ne úplně esteticky přijatelné a je třeba na znaménko myslet i při dotazech. Lehce vylepšit lze uvedenou situaci tím, že jako výchozí hodnotu zvolíme maximum 32767 a negativní inkrement a většina našich hodnot bude v kladném rozsahu.

Leave a Reply

Your email address will not be published. Required fields are marked *