当前位置: 首页 > 知识库问答 >
问题:

SQL Server更改主键数据类型

苍兴怀
2023-03-14

我正在开发SQL Server 2012:

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

我是否要更改表并将int列作为主键删除?

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

非常感谢。

共有3个答案

岳永思
2023-03-14

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

此脚本假定不存在任何非主键约束(例如外键),具体取决于此列。

它有一些安全检查,因为这是为了部署到不同的服务器(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
贺经纶
2023-03-14

可以通过三个步骤更改主键的日期类型

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

ALTER TABLE table_name
 DROP CONSTRAINT constraint_name;

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

ALTER TABLE  table_name
ALTER COLUMN pk_column_name target_data_type(size) not null;

第3步:-重新设置更改后的列主键

ALTER TABLE table_name
ADD PRIMARY KEY (pk_column_name);

附言:-

>

如果pk_column中已经有数据,请确保该列的源数据和目标数据类型都可以用于存量数据。否则,还需要两个步骤将存量数据移动到临时列,然后执行这些步骤,并在检查和删除该临时列后返回该数据。

空鸿云
2023-03-14

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

对象XXXX依赖于列XXXX。

唯一的选择是

1.放下主键
2。更改数据类型
3。重新创建主键

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)的子句,它使事情变得简单,在最后阶段删除聚集索引,并保持旧索引对所有操作可用...但是在你的情况下,这个子句不起作用...

所以我推荐

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

这样你可能会有更少的停机时间

 类似资料:
  • 问题内容: 我在80多个不同的表中都有一个ReferenceIDvarchar(6)列。我需要在分配ID的政府组织实施更改之后,将其扩展到整个db的varchar(8)。 我希望声明一个游标以获取表名,如下所示: 然后按如下所示编辑类型: 之所以失败,是因为该列是某些表中主键的一部分(并且PK中包含的列因表而异)。 我真的不想不必为每个表手动删除并重新创建每个PK。 在游标中,有一种方法可以在更改

  • 在这里,是主列键中的第三列。我想要做到这一点的唯一方法是将主复合键更改为。我找不到任何文档告诉我如何做到这一点。有可能吗? 或者,我是否错过了解决这个问题的“正确”方法/我是否曲解了这个问题?

  • 好的,所以我不确定这是否可能,但我需要更改一个表中的主键值,以匹配另一个表中的FK值。 我创建了一个表-POS_Transactions(FK REGISTER)并导入了它的值,然后创建了另一个表-Registers(pk Registers key)并导入了它的值。但是当我导入寄存器的值时,我遇到了一些问题,必须清除表并再次尝试多次(这就是为什么数字是从15到22的原因,它只是以这种方式自动更新

  • 问题内容: 我试图将我的SQL数据库中表的主键从现有键更改为复合键,其中不包括现有列。由于出现以下错误消息,因此以下代码无法正常工作: 删除主键: PRIMARY附近的语法不正确。预期为COLUMN,CONSTRAINT,ID或QUOTED_ID 添加主键: PRIMARY附近的语法不正确。 期望ID T-SQL代码: 编辑 我可以通过使用以下两个查询语句来完成此操作 我没有要求SQL“ DROP

  • 本节讨论了MySQL 5.1中DECIMAL数据类型(以及其同义类型)的特性,尤其是下述方面: ·数字的最大数。 ·存储格式。 ·存储要求。 ·对DECIMAL列上界 的非标准MySQL扩展。 在本节中,对于为较早MySQL版本编写的应用程序,在相应的地方指出了可能的不兼容性。 DECIMAL列的声明语法是DECIMAL(M,D)。在MySQL 5.1中,参量的取值范围如下: ·M是数字的最大数(

  • 问题内容: 我收到的时候我想改变我的以下异常中的。 我知道我要更改表中的主键。我正在使用JPA注释。 我通过使用以下单个HQL查询解决了此问题: 而不是使用更多的OO方法: 知道差异是什么吗? 问题答案: 我无法想象你为什么要这么做。完全没有 您为什么要更改实体的身份?您还需要更新指向它的其他表中的所有外键。似乎很痛苦,没有收获。您最好将其设置为“业务密钥”(普通属性),并使用更永久的代理密钥。我