Delen via


CREATE TABLE (Transact-SQL) IDENTITY (eigenschap)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Hiermee maakt u een identiteitskolom in een tabel. Deze eigenschap wordt gebruikt met de CREATE TABLE en ALTER TABLE Transact-SQL-statements.

Note

De eigenschap IDENTITY verschilt van de eigenschap SQL-DMO Identity waarmee de eigenschap rij-id van een kolom wordt weergegeven.

Transact-SQL syntaxis-conventies

Syntax

Syntaxis voor Fabric Data Warehouse:

IDENTITY 
IDENTITY [ (seed , increment) ]

Arguments

seed

De waarde die wordt gebruikt voor de eerste rij die in de tabel is geladen.

increment

De incrementele waarde die wordt toegevoegd aan de identiteitswaarde van de vorige rij die is geladen.

U moet zowel het zaad als het aantal stappen opgeven of geen van beide. Als geen van beide is opgegeven, is de standaardwaarde (1,1).

Remarks

Identiteitskolommen kunnen worden gebruikt voor het genereren van sleutelwaarden.

De identiteitseigenschap in een kolom garandeert de volgende voorwaarden:

  • Elke nieuwe waarde wordt gegenereerd op basis van de huidige seed en increment.

  • Elke nieuwe waarde voor een bepaalde transactie verschilt van andere gelijktijdige transacties in de tabel.

De identiteitseigenschap in een kolom garandeert niet de volgende voorwaarden:

  • Uniekheid van de waarde: uniekheid moet worden afgedwongen met behulp van een PRIMARY KEY of UNIQUE beperking of UNIQUE index.

  • Opeenvolgende waarden binnen een transactie : een transactie die meerdere rijen invoegt, krijgt niet gegarandeerd opeenvolgende waarden voor de rijen omdat andere gelijktijdige invoegingen in de tabel kunnen optreden. Als waarden opeenvolgend moeten zijn, moet de transactie een exclusieve vergrendeling in de tabel gebruiken of het SERIALIZABLE isolatieniveau gebruiken.

  • Opeenvolgende waarden na het opnieuw opstarten van de server of andere fouten : SQL Server kan identiteitswaarden in de cache opslaan om prestatieredenen en sommige van de toegewezen waarden kunnen verloren gaan tijdens een databasefout of het opnieuw opstarten van de server. Dit kan leiden tot hiaten in de identiteitswaarde bij het invoegen. Als hiaten niet acceptabel zijn, moet de toepassing een eigen mechanisme gebruiken om sleutelwaarden te genereren. Het gebruik van een reeksgenerator met de NOCACHE optie kan de hiaten beperken tot transacties die nooit worden doorgevoerd.

  • Hergebruik van waarden : voor een bepaalde identiteitseigenschap met specifieke seed/increment worden de identiteitswaarden niet opnieuw gebruikt door de engine. Als een bepaalde invoeginstructie mislukt of als de invoeginstructie wordt teruggedraaid, gaan de verbruikte identiteitswaarden verloren en worden ze niet opnieuw gegenereerd. Dit kan leiden tot hiaten wanneer de volgende identiteitswaarden worden gegenereerd.

Deze beperkingen maken deel uit van het ontwerp om de prestaties te verbeteren en omdat ze in veel voorkomende situaties acceptabel zijn. Als u vanwege deze beperkingen geen identiteitswaarden kunt gebruiken, maakt u een afzonderlijke tabel met een huidige waarde en beheert u de toegang tot de tabel- en nummertoewijzing met uw toepassing.

Als een tabel met een identiteitskolom wordt gepubliceerd voor replicatie, moet de identiteitskolom worden beheerd op een manier die geschikt is voor het gebruikte type replicatie. Zie Identiteitskolommen repliceren voor meer informatie.

In tabellen die zijn geoptimaliseerd voor geheugen, moet de seed en increment worden ingesteld op 1, 1. Het instellen van de seed of increment op een andere waarde dan 1 resulteert in de volgende fout: The use of seed and increment values other than 1 is not supported with memory optimized tables.

Er kan slechts één identiteitskolom per tabel worden gemaakt.

Zodra de identiteitseigenschap is ingesteld op een kolom, kan deze niet worden verwijderd. Het gegevenstype kan worden gewijzigd zolang het nieuwe gegevenstype compatibel is met de identiteitseigenschap.

In Fabric Data Warehouse kun je niet specificeren seed of increment, omdat deze waarden automatisch worden beheerd om unieke gehele getallen te leveren. BIGINT IDENTITY is alles wat nodig is voor een kolomdefinitie in een CREATE TABLE stelling. Voor meer informatie, zie IDENTITY in Fabric Data Warehouse.

Je kunt tabellen migreren naar Fabric Data Warehouse met surrogaatsleutelkolommen nadat je bent aangepast aan de verschillen in de IDENTITY implementatie in Fabric Data Warehouse.

Azure Synapse Analytics biedt geen ondersteuning PRIMARY KEY voor of UNIQUE beperking of UNIQUE index. Zie Identity gebruiken om surrogaatsleutels te maken in een Synapse SQL-pool voor meer informatie. - In dedicated SQL-pools in Azure Synapse Analytics zijn waarden voor identiteit niet incrementeel vanwege de gedistribueerde architectuur van het datawarehouse. Zie Identity gebruiken om surrogaatsleutels te maken in een Synapse SQL-pool voor meer informatie. - IDENTITY wordt niet ondersteund door serverless SQL-pools in Azure Synapse Analytics.

Examples

A. De eigenschap IDENTITY gebruiken met CREATE TABLE

In het volgende voorbeeld wordt een nieuwe tabel gemaakt met behulp van de IDENTITY eigenschap voor een automatisch verhogend identificatienummer.

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. Algemene syntaxis gebruiken om hiaten in identiteitswaarden te vinden

In het volgende voorbeeld ziet u algemene syntaxis voor het vinden van hiaten in identiteitswaarden wanneer gegevens worden verwijderd.

Note

Het eerste deel van het volgende Transact-SQL script is alleen bedoeld voor illustratie. U kunt het Transact-SQL script uitvoeren dat begint met de opmerking: -- 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. Maak een tabel aan met een IDENTITY-kolom in Fabric Data Warehouse

Van toepassing op: Fabric Data Warehouse

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

Deze instructie creëert de dbo.Employees tabel waarin elke nieuwe rij automatisch een unieke EmployeeID als bigintwaarde ontvangt. Voor meer informatie, zie IDENTITY in Fabric Data Warehouse.

We kunnen ze gebruiken SELECT... INTO om een kopie van deze tabel te maken, waarbij we de IDENTITY eigenschap in de doel-tabel behouden:

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

De kolom in de doeltabel erft de IDENTITY eigenschap van de brontabel. Voor een lijst van beperkingen die op dit scenario van toepassing zijn, zie de sectie Gegevenstypen van SELECT - INTO Clause.