簡體   English   中英

將ID(INT)更改為ID(UUID)

[英]Change ID(INT) to ID(UUID)

在現有數據庫中,我想將現有ID更改為UUID上的int

如下所示,該列現在是具有CLUSTERED索引的主鍵

樣本表創建代碼:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tblUsers](
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [LastName] [nvarchar](100) NOT NULL,
    [LoginName] [nvarchar](25) NOT NULL,
    [RoleID] [int] NOT NULL,
 CONSTRAINT [PK_tblUsers] PRIMARY KEY CLUSTERED 
(
    [UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

如何快速解決許多表的問題?

該表可以有很多行,所以我想知道如何做索引。 通常,您不應在UUID上創建索引。

編輯:

另一個引用表的示例:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[tblUsersDist](
    [UserDistID] [int] IDENTITY(1,1) NOT NULL,
    [UserID] [int] NOT NULL,
    [LocationId] [int] NOT NULL,
 CONSTRAINT [PK_tblUsersDist] PRIMARY KEY CLUSTERED 
(
    [UserDistID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

你不得不:

  1. 開始交易
  2. PRIMARY KEY放在原始表上。
  3. 添加一個具有uniqueidentifier數據類型的新列。
  4. 用新的UUID值更新新列。
  5. 將新列設置為NOT NULLPRIMARY KEY所需)。
  6. 刪除原始的INT列。
  7. 重命名新的UUID列以匹配原始的INT列(可選)。
  8. 添加一個新的PRIMARY KEY約束。
  9. 提交交易。

例:

CREATE TABLE Test (
    UserID INT IDENTITY,
    Data INT,
    CONSTRAINT PK_Test PRIMARY KEY CLUSTERED (UserID))

INSERT INTO Test (Data)
VALUES (10), (20)


BEGIN TRANSACTION

    ALTER TABLE Test DROP PK_Test

    ALTER TABLE Test ADD UUID uniqueidentifier

    UPDATE Test SET UUID = NEWID()

    ALTER TABLE Test ALTER COLUMN UUID uniqueidentifier NOT NULL

    ALTER TABLE Test DROP COLUMN UserID

    EXEC sp_rename 'dbo.Test.UUID', 'UserID', 'COLUMN'

    ALTER TABLE Test ADD CONSTRAINT PK_Test PRIMARY KEY (UserID)

COMMIT

請注意,該示例缺少正確的錯誤處理。 此外,如果您有外鍵,則必須在開始時將其刪除並在末尾重新創建它們,但要注意新的數據類型

就個人而言,我將創建一個新表,插入舊值,為每個表效仿,然后刪除舊表並重命名新表。 混亂,但是更改PK的數據類型總是很麻煩。

CREATE TABLE dbo.tblUsers_New (UserID uniqueidentifier
                                   DEFAULT NEWSEQUENTIALID() NOT NULL,
                               OldUserID int NULL, --incase you'll keep it, as new user won't have a new "old" ID
                               LastName nvarchar(100) NOT NULL,
                               LoginName nvarchar(25) NOT NULL,
                               RoleID int,         --Is that going to be a GUID too?
                               CONSTRAINT [PK_tblUsers]
                                   PRIMARY KEY CLUSTERED ([UserID] ASC));

INSERT INTO tblUsers_New (OldUserID,LastName,LoginName,RoleID)
SELECT UserID,
       LastName,
       LoginName,
       RoleID
FROM dbo.tblUsers
ORDER BY UserID ASC;

/* Repeat process for all of your other tables, maintaining referencial integrity.
   Start dropping the old tables, again, maintaining referential integrity
   and renaming the new tables.
*/

DROP TABLE dbo.tbl_users;
EXEC sp_rename N'dbo.tblUsers_New', N'tblUsers';  

/* Then finally set up the Foreign key constraints.*/

當然,這只是如何做的一個模糊的主意,因為我們對您的數據只有一個模糊的主意。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM