Sdílet prostřednictvím


CREATE TABLE (Transact-SQL) IDENTITY (vlastnost)

Platí na:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsSklad v Microsoft FabricSQL databáze v Microsoft Fabric

Vytvoří sloupec identity v tabulce. Tato vlastnost se používá s CREATE TABLE výroky a ALTER TABLE Transact-SQL.

Note

Vlastnost IDENTITY se liší od vlastnosti SQL-DMO Identity , která zveřejňuje vlastnost identity řádku sloupce.

Transact-SQL konvence syntaxe

Syntax

Syntax pro Fabric Data Warehouse:

IDENTITY 
IDENTITY [ (seed , increment) ]

Arguments

seed

Hodnota použitá pro úplně první řádek načtený do tabulky.

increment

Přírůstková hodnota přidaná k hodnotě identity předchozího řádku, který byl načten.

Musíte zadat počáteční i přírůstkové nebo ani jedno. Pokud není zadán žádný z nich, výchozí hodnota je (1,1).

Remarks

Sloupce identity se dají použít ke generování klíčových hodnot.

Vlastnost identity ve sloupci zaručuje následující podmínky:

  • Každá nová hodnota se generuje na základě aktuálního počátečního a přírůstku.

  • Každá nová hodnota pro konkrétní transakci se liší od ostatních souběžných transakcí v tabulce.

Vlastnost identity ve sloupci nezaručuje následující podmínky:

  • Jedinečnost hodnoty – Jedinečnost musí být vynucena pomocí PRIMARY KEY omezení nebo UNIQUEUNIQUE indexu.

  • Po sobě jdoucí hodnoty v rámci transakce – Transakce, která vkládá více řádků, není zaručeno získání po sobě jdoucích hodnot pro řádky, protože v tabulce mohou nastat další souběžné vložení. Pokud musí být hodnoty po sobě jdoucí, transakce by měla použít výhradní zámek tabulky nebo použít SERIALIZABLE úroveň izolace.

  • Po sobě jdoucí hodnoty po restartování serveru nebo jiných selhání – SQL Server může ukládat hodnoty identity do mezipaměti z důvodů výkonu a některé přiřazené hodnoty mohou být ztraceny během selhání databáze nebo restartování serveru. To může mít za následek mezery v hodnotě identity po vložení. Pokud mezery nejsou přijatelné, měla by aplikace k vygenerování hodnot klíče použít vlastní mechanismus. Použití generátoru NOCACHE sekvencí s možností může omezit mezery na transakce, které nejsou nikdy potvrzeny.

  • Opakované použití hodnot – Pro danou vlastnost identity s určitým počátečním/přírůstkem se hodnoty identity nevyuužijí modulem. Pokud se konkrétní příkaz insert nezdaří nebo pokud se příkaz insert vrátí zpět, ztratí se hodnoty spotřebované identity a negenerují se znovu. To může mít za následek mezery, když se vygenerují následující hodnoty identity.

Tato omezení jsou součástí návrhu, aby se zlepšil výkon, a protože jsou v mnoha běžných situacích přijatelné. Pokud kvůli těmto omezením nemůžete použít hodnoty identit, vytvořte samostatnou tabulku s aktuální hodnotou a spravujte přístup k tabulce a přiřazení čísel v aplikaci.

Pokud je tabulka se sloupcem identity publikovaná pro replikaci, musí se sloupec identity spravovat způsobem, který je vhodný pro typ použité replikace. Další informace najdete v tématu Replikace sloupců identit.

V tabulkách optimalizovaných pro paměť musí být počáteční a přírůstkové hodnoty nastaveny na 1, 1hodnotu . Nastavení počátečního nebo přírůstku na jinou hodnotu, než 1 má za následek následující chybu: The use of seed and increment values other than 1 is not supported with memory optimized tables

Pro každou tabulku je možné vytvořit pouze jeden sloupec identity.

Jakmile je vlastnost identity nastavená ve sloupci, nedá se odebrat. Datový typ lze změnit, pokud je nový datový typ kompatibilní s vlastností identity.

V Fabric Data Warehouse nelze specifikovat seed ani increment, protože tyto hodnoty jsou automaticky spravovány tak, aby poskytly unikátní celá čísla. BIGINT IDENTITY je vše, co je potřeba pro definici sloupce ve CREATE TABLE výroku. Pro více informací viz IDENTITA v Fabric Data Warehouse.

Po přizpůsobení se rozdílům v implementaci v Fabric Data Warehouse můžete tabulky migrovat do Fabric Data Warehouse s náhradními klíčovými sloupci.IDENTITY

Azure Synapse Analytics nepodporuje PRIMARY KEY ani UNIQUE neomezuje ani UNIQUE index. Další informace najdete v tématu Použití identity k vytvoření náhradních klíčů ve fondu Synapse SQL. - V dedikovaných SQL poolech v Azure Synapse Analytics nejsou hodnoty identity inkrementální kvůli distribuované architektuře datového skladu. Další informace najdete v tématu Použití identity k vytvoření náhradních klíčů ve fondu Synapse SQL. - IDENTITY není podporován serverless SQL pooly v Azure Synapse Analytics.

Examples

A. Použití vlastnosti IDENTITY s CREATE TABLE

Následující příklad vytvoří novou tabulku pomocí IDENTITY vlastnosti pro automatické zvýšení identifikačního čísla.

USE AdventureWorks2022;
GO
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. Použití obecné syntaxe k vyhledání mezer v hodnotách identity

Následující příklad ukazuje obecnou syntaxi pro hledání mezer v hodnotách identity při odebrání dat.

Note

První část následujícího skriptu Transact-SQL je určena pouze pro ilustraci. Můžete spustit Transact-SQL skript, který začíná komentářem: -- Create the img table.

-- 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;

A. Vytvořte tabulku se sloupcem IDENTITY ve Fabric Data Warehouse

Platí pro: Datový sklad prostředků infrastruktury

CREATE TABLE dbo.Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50),
    Retired BIT
);

Tento výrok vytváří tabulku dbo.Employees , kde každý nový řádek automaticky přijímá unikátní EmployeeID hodnotu jako bigint . Pro více informací viz IDENTITA v Fabric Data Warehouse.

Můžeme použít k SELECT... INTO vytvoření kopie této tabulky, přičemž v cílové tabulce se zachová vlastnost:IDENTITY

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE Retired = 1;

Sloupec v cílové tabulce dědí vlastnost IDENTITY ze zdrojové tabulky. Pro seznam omezení, která se na tento scénář vztahují, viz sekce Datové typy v klauzuli SELECT - INTO.