Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

SQL Server, Bagaimana cara mengatur kenaikan otomatis setelah membuat tabel tanpa kehilangan data?

Mengubah IDENTITY properti benar-benar hanya metadata yang berubah. Tetapi untuk memperbarui metadata secara langsung, Anda harus memulai instance dalam mode pengguna tunggal dan mengotak-atik beberapa kolom di sys.syscolpars dan tidak terdokumentasi/tidak didukung dan bukan sesuatu yang saya rekomendasikan atau akan saya berikan detail tambahannya.

Bagi orang-orang yang menemukan jawaban ini di SQL Server 2012+ sejauh ini, cara termudah untuk mencapai hasil kolom kenaikan otomatis ini adalah dengan membuat SEQUENCE objek dan atur next value for seq sebagai kolom default.

Sebagai alternatif, atau untuk versi sebelumnya (mulai 2005 dan seterusnya), solusi yang diposting pada item koneksi ini menunjukkan cara yang didukung sepenuhnya untuk melakukan ini tanpa memerlukan ukuran operasi data menggunakan ALTER TABLE...SWITCH . Juga membuat blog tentang MSDN di sini. Meskipun kode untuk mencapai ini tidak terlalu sederhana dan ada batasan - seperti tabel yang diubah tidak dapat menjadi target batasan kunci asing.

Contoh kode.

Siapkan tabel pengujian tanpa identity kolom.

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

Ubah menjadi identity kolom (kurang lebih instan).

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;

Uji hasilnya.

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

Memberikan

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

Bersihkan

DROP TABLE dbo.tblFoo


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mengotomatiskan tugas menghasilkan skrip di SQL Server Management Studio 2008?

  2. Cara Membuat Batasan Kunci Asing dengan Opsi ON DELETE SET NULL di SQL Server - Tutorial SQL Server / TSQL Bagian 81

  3. Pengembangan Mesin Virtual Azure untuk Penggunaan SQL Server

  4. Apakah ada cara untuk tidak menggunakan tanda kurung siku di SQL Server?

  5. Bagaimana cara mendapatkan Insert id di MSSQL di PHP?