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

Cara menambahkan kolom identitas ke tabel database yang ada yang memiliki banyak baris

Proses keseluruhan mungkin akan jauh lebih lambat dengan lebih banyak overhead penguncian secara keseluruhan, tetapi jika Anda hanya peduli dengan ukuran log transaksi, Anda dapat mencoba yang berikut ini.

  1. Tambahkan kolom non identitas integer yang dapat dibatalkan (hanya metadata yang berubah).
  2. Tulis kode untuk memperbarui ini dengan bilangan bulat berurutan yang unik dalam kumpulan. Ini akan mengurangi ukuran setiap transaksi individual dan menjaga ukuran log tetap rendah (dengan asumsi model pemulihan sederhana). Kode saya di bawah ini melakukan ini dalam batch 100 semoga Anda memiliki PK yang ada yang dapat Anda manfaatkan untuk melanjutkan di mana Anda tinggalkan daripada pemindaian berulang yang akan memakan waktu semakin lama menjelang akhir.
  3. gunakan ALTER TABLE ... ALTER COLUMN untuk menandai kolom sebagai NOT NULL . Ini akan mengharuskan seluruh tabel dikunci dan dipindai untuk memvalidasi perubahan tetapi tidak memerlukan banyak pencatatan.
  4. Gunakan ALTER TABLE ... SWITCH untuk menjadikan kolom tersebut sebagai kolom identitas. Ini adalah perubahan metadata saja.

Contoh Kode Di Bawah

/*Set up test table with just one column*/

CREATE TABLE table_1 ( original_column INT )
INSERT  INTO table_1
        SELECT DISTINCT
                number
        FROM    master..spt_values



/*Step 1 */
ALTER TABLE table_1 ADD id INT NULL



/*Step 2 */
DECLARE @Counter INT = 0 ,
    @PrevCounter INT = -1

WHILE @PrevCounter <> @Counter 
    BEGIN
        SET @PrevCounter = @Counter;
        WITH    T AS ( SELECT TOP 100
                                * ,
                                ROW_NUMBER() OVER ( ORDER BY @@SPID )
                                + @Counter AS new_id
                       FROM     table_1
                       WHERE    id IS NULL
                     )
            UPDATE  T
            SET     id = new_id
        SET @Counter = @Counter + @@ROWCOUNT
    END


BEGIN TRY;
    BEGIN TRANSACTION ;
     /*Step 3 */
    ALTER TABLE table_1 ALTER COLUMN id INT NOT NULL

    /*Step 4 */
    DECLARE @TableScript NVARCHAR(MAX) = '
    CREATE TABLE dbo.Destination(
        original_column INT,
        id INT IDENTITY(' + CAST(@Counter + 1 AS VARCHAR) + ',1)
        )

        ALTER TABLE dbo.table_1 SWITCH TO dbo.Destination;
    '       

    EXEC(@TableScript)


    DROP TABLE table_1 ;

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


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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Harus mendeklarasikan kesalahan variabel @myvariable dengan kueri berparameter ADO

  2. Menerapkan Beban Tambahan menggunakan Ubah Pengambilan Data di SQL Server

  3. Apa itu Operator Logika SEPERTI di SQL Server - Tutorial SQL Server / TSQL Bagian 123

  4. Jumlah SSIS Variabel Objek?

  5. Menonaktifkan batasan kunci asing, masih tidak dapat memotong tabel? (SQLServer 2005)