Изменить идентификатор (INT) на идентификатор (UUID) - PullRequest
1 голос
/ 09 мая 2019

В существующей базе данных я хотел бы изменить существующий идентификатор как int на UUID

Как вы можете видеть ниже, столбец теперь является основным ключом с индексом 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.

EDIT:

Пример другой справочной таблицы:

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

Ответы [ 2 ]

0 голосов
/ 09 мая 2019

Лично я бы создал новую таблицу, вставил старые значения, следовал бы примеру для каждой таблицы, а затем отбросил старую таблицу и переименовал новую.Грязно, но изменение типа данных ПК всегда грязно.

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.*/

Это, конечно, только смутное представление о том, как это сделать, поскольку у нас есть только смутное представление о ваших данных.

0 голосов
/ 09 мая 2019

Вам потребуется:

  1. Начать транзакцию
  2. Удалить PRIMARY KEY на исходной таблице.
  3. Добавить новый столбец с uniqueidentifier тип данных.
  4. Обновить новый столбец новыми значениями UUID.
  5. Установить новый столбец как NOT NULL (необходим для PRIMARY 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

Обратите внимание, что в примере отсутствует правильная обработка ошибок.Кроме того, если у вас есть внешние ключи, вам придется отбросить их в начале и заново создать их в конце, но остерегайтесь нового типа данных .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...