sql >> Databáze >  >> RDS >> Sqlserver

SQL Server, Jak nastavit automatický přírůstek po vytvoření tabulky bez ztráty dat?

Změna IDENTITY vlastnost je ve skutečnosti pouze změna metadat. Přímá aktualizace metadat však vyžaduje spuštění instance v režimu jednoho uživatele a pohrát si s některými sloupci v sys.syscolpars a je nezdokumentovaný/nepodporovaný a nejedná se o něco, co bych doporučoval nebo o čem bych poskytnul další podrobnosti.

Pro lidi, kteří se setkávají s touto odpovědí na SQL Server 2012+, by bylo zdaleka nejjednodušším způsobem, jak dosáhnout tohoto výsledku sloupce automatického zvyšování, vytvořit SEQUENCE objekt a nastavte next value for seq jako výchozí sloupec.

Alternativně nebo pro předchozí verze (od roku 2005 dále) ukazuje řešení uvedené na této položce připojení zcela podporovaný způsob, jak toho dosáhnout, aniž by bylo nutné provádět operace s daty pomocí ALTER TABLE...SWITCH . Také se zde blogovalo o na MSDN. I když kód, jak toho dosáhnout, není příliš jednoduchý a existují omezení – například změna tabulky nemůže být cílem omezení cizího klíče.

Příklad kódu.

Nastavte testovací tabulku bez identity sloupec.

CREATE TABLE dbo.tblFoo 
(
bar INT PRIMARY KEY,
filler CHAR(8000),
filler2 CHAR(49)
)


INSERT INTO dbo.tblFoo (bar)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2

Změňte jej tak, aby měl identity sloupec (víceméně okamžitý).

BEGIN TRY;
    BEGIN TRANSACTION;

    /*Using DBCC CHECKIDENT('dbo.tblFoo') is slow so use dynamic SQL to
      set the correct seed in the table definition instead*/
    DECLARE @TableScript nvarchar(max)
    SELECT @TableScript = 
    '
    CREATE TABLE dbo.Destination(
        bar INT IDENTITY(' + 
                     CAST(ISNULL(MAX(bar),0)+1 AS VARCHAR) + ',1)  PRIMARY KEY,
        filler CHAR(8000),
        filler2 CHAR(49)
        )

        ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
    '       
    FROM dbo.tblFoo
    WITH (TABLOCKX,HOLDLOCK)

    EXEC(@TableScript)


    DROP TABLE dbo.tblFoo;

    EXECUTE sp_rename N'dbo.Destination', N'tblFoo', 'OBJECT';


    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;

Otestujte výsledek.

INSERT INTO dbo.tblFoo (filler,filler2) 
OUTPUT inserted.*
VALUES ('foo','bar')

Dává

bar         filler    filler2
----------- --------- ---------
10001       foo       bar      

Uklidit

DROP TABLE dbo.tblFoo


  1. Jak exportovat výsledek dotazu do .csv nebo souboru odděleného tabulátory v SQL Server Management Studio (SSMS) - SQL Server / Výukový program TSQL, část 23

  2. Běžné chyby SQL Serveru

  3. Vkládejte objekty BLOB do databází MySql pomocí php

  4. Zvýšení výkonu pomocí čtení a zápisu rozdělení databázového provozu s Moodle 3.9