首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Server更改主键数据类型

Server更改主键数据类型
EN

Stack Overflow用户
提问于 2017-01-09 13:50:50
回答 6查看 52.5K关注 0票数 24

我在做SQL Server 2012

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

我是否修改表并将int列移除为primary key

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

谢谢。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-01-09 14:32:52

您不能更改主键列,除非您删除it..Any操作以更改其数据类型将导致以下错误。

对象'XXXX‘依赖于列'XXXX’。

唯一的选择就是

1.删除主键

2.改变数据类型

3.重新创建主键

代码语言:javascript
复制
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)

从2012年起,有一个名为(DROP_EXISTING = ON)的子句使事情变得简单,通过在最后阶段删除聚集索引,并且在您的情况下使所有operations..But都可以使用旧索引,这个子句将无法工作。

所以我建议

1.使用不同的名称创建具有所需模式和索引的新表

2.从旧表插入数据到新表

3.最后,在切换时插入积累的数据。

4.将表重命名为旧表名

这样你的停机时间就会更少

票数 30
EN

Stack Overflow用户

发布于 2018-12-03 07:23:52

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

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

代码语言:javascript
复制
ALTER TABLE table_name
 DROP CONSTRAINT constraint_name;

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

代码语言:javascript
复制
ALTER TABLE  table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;

步骤3 :-使更改后的列再次使用主键

代码语言:javascript
复制
ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);

PS :-

  • 当您试图更改pk_column时,可以从错误消息中获取约束名称。
  • 如果pk_column中已经有数据,请确保列的源数据类型和目标数据类型都可以用于现有数据。否则,还需要另外两个步骤才能将现有数据移动到临时列,然后执行这些步骤,并在检查和删除该临时列后返回该数据。
票数 14
EN

Stack Overflow用户

发布于 2018-02-08 13:26:44

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

这个脚本假设没有任何非主键约束(例如外键)取决于这个列。

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

我希望这能帮上忙。如果你在投票前发现有什么问题,请告诉我。我非常乐意更新脚本。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41549549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档