SQL Server更改主键数据类型

Guy*_*gar 13 primary-key sql-server-2012

我正在努力SQL Server 2012:

我有一个主键列表INT.我需要将其更改为GUID.

我是否更改了表并删除了int列primary key

添加GUID列并将其设置为Primary并删除旧的INT列?

谢谢.

The*_*war 17

您无法更改主键列,除非您删除它.任何更改其数据类型的操作都将导致以下错误.

对象'PK__t1__7D78A4E7'取决于列'id'.

唯一的选择是

1.Drop主键
2.更改数据类型
3.recreate主键

ALTER TABLE t1  
DROP CONSTRAINT PK__t1__3213E83F88CF144D;   
GO  

alter table t1 
alter column id varchar(10) not null

alter table t1 add primary key (id)
Run Code Online (Sandbox Code Playgroud)

从2012年开始,有一个叫做(DROP_EXISTING = ON)简单的子句,通过在最后阶段删除聚集索引并保持旧索引可用于所有操作.但在你的情况下,这个子句将不起作用.

所以我推荐

1.创建具有所需模式和索引的新表,使用不同的名称
2.将数据从旧表
插入到新表3.最后在切换时插入已累积的数据
4.将表重命名为旧表名

这样您可以减少停机时间


小智 10

可以分三步更改主键的日期类型

第 1 步:- 删除与主键关联的约束

ALTER TABLE table_name
 DROP CONSTRAINT constraint_name;
Run Code Online (Sandbox Code Playgroud)

第 2 步:- 将 Primay 键列更改为有效的主键数据类型

ALTER TABLE  table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;
Run Code Online (Sandbox Code Playgroud)

第 3 步:- 再次使更改的列主键

ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);
Run Code Online (Sandbox Code Playgroud)

附:-

  • 当您尝试更改 pk_column 时,您可以从错误消息中获取约束名称

  • 如果 pk_column 中已有数据,请确保该列的源数据类型和目标数据类型均可用于现有数据。否则需要另外两个步骤将现有数据移动到临时列,然后执行这些步骤并在审查和删除该临时列后恢复该数据。


  • 最佳答案 (2认同)

Men*_*nol 5

下面是我编写的一个脚本,用于帮助我们部署对主键列数据类型的更改。

该脚本假设不存在任何依赖于此列的非主键约束(例如外键)。

它有一些安全检查,因为它被设计为部署到不同的服务器(dev、uat、live),如果服务器上的表有某种不同,则不会产生副作用。

我希望这可以帮助别人。如果您在投票之前发现任何问题,请告诉我。我非常乐意更新脚本。

IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WITH (NOLOCK) WHERE C.TABLE_CATALOG = '<<DB>>' AND C.TABLE_SCHEMA = 'dbo' AND C.TABLE_NAME = '<<Table>>' 
AND C.COLUMN_NAME = '<<COLUMN>>' AND C.DATA_TYPE = 'int') -- <- Additional test to check the current datatype so this won't make unnecessary or wrong updates
BEGIN
    DECLARE @pkName VARCHAR(200);
    SELECT @pkName = pkRef.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS pkRef WITH (NOLOCK)
    WHERE pkRef.TABLE_CATALOG = '<<DB>>' AND pkRef.TABLE_SCHEMA = 'dbo' AND TABLE_NAME = '<<Table>>'

    IF(@pkName IS NOT NULL)
    BEGIN
        -- Make sure the primary key name is the one you are going to use in script beyond this point.
        IF(@pkName != '<<PRIMARY KEY NAME>>') 
        BEGIN
            RAISERROR ('Unexpected primary key name - The primary key found has a different name than expected. Please update the script.', 16, 1);
            RETURN;
        END

        ALTER TABLE dbo.<<Table>>
              DROP CONSTRAINT <<PRIMARY KEY NAME>>; -- Note: this is not a string or a variable (just type the PK name)
        SELECT 'Dropped existing primary key';
    END

    ALTER TABLE dbo.<<Table>> ALTER COLUMN ID BIGINT
    SELECT 'Updated column type to big int';

    ALTER TABLE dbo.<<Table>>
          ADD CONSTRAINT <<PRIMARY KEY NAME>> PRIMARY KEY CLUSTERED (<<COLUMN>>);
    SELECT 'Created the primary key';
END
ELSE
BEGIN
    SELECT 'No change required.';
END
Run Code Online (Sandbox Code Playgroud)