当前位置: 首页 > 面试题库 >

使用主键更改列数据类型

桑博远
2023-03-14
问题内容

我在80多个不同的表中都有一个ReferenceIDvarchar(6)列。我需要在分配ID的政府组织实施更改之后,将其扩展到整个db的varchar(8)。

我希望声明一个游标以获取表名,如下所示:

DECLARE @TableName AS VARCHAR(200)
DECLARE TableCursor CURSOR LOCAL READ_ONLY FOR
SELECT t.name AS TableName
    FROM sys.columns c
        JOIN sys.tables t ON c.object_id = t.object_id
    WHERE c.name = 'ReferenceID'

OPEN TableCursor
    FETCH NEXT FROM TableCursor 
    INTO @TableName

然后按如下所示编辑类型:

ALTER TABLE @TableName ALTER COLUMN ReferenceID VARCHAR(8)

之所以失败,是因为该列是某些表中主键的一部分(并且PK中包含的列因表而异)。

我真的不想不必为每个表手动删除并重新创建每个PK。

在游标中,有一种方法可以在更改数据类型之前先禁用PK,然后重新启用它,或者在更改数据类型的任一侧删除并重新创建PK,请记住PK将取决于我们使用的表目前正在看吗?


问题答案:

您需要在中NOT NULL明确指定,ALTER TABLE ... ALTER COLUMN否则默认为allow
NULL。PK列中不允许这样做。

以下工作正常。

CREATE TABLE p
(
ReferenceID VARCHAR(6) NOT NULL PRIMARY KEY
)

INSERT INTO p VALUES ('AAAAAA')

ALTER TABLE p ALTER COLUMN ReferenceID VARCHAR(8) NOT NULL

NOT NULL省略时,会出现以下错误

Msg 5074, Level 16, State 1, Line 1
The object 'PK__p__E1A99A792180FB33' is dependent on column 'ReferenceID'.
Msg 4922, Level 16, State 9, Line 1
ALTER TABLE ALTER COLUMN ReferenceID failed because one or more objects access this column.

一对夫妇的事情在你的编程方法需要考虑的是,你 需要删除任何外键引用的ReferenceID临时列,并且确保你不包括NOT NULL用于(非PK) ReferenceID,目前列 空。



 类似资料:
  • 我正在开发SQL Server 2012: 我有一个主键列为的表。我需要将其更改为GUID。 我是否要更改表并将int列作为主键删除? 添加GUID列并将其设置为主列,然后删除旧的INT列? 非常感谢。

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

  • 问题内容: 我们需要将某些列的数据类型从int更改为bigint。不幸的是,其中一些表很大,大约有7-10百万行(但不宽)。 Alter表alter列将永远保留在这些表上。有没有更快的方法来实现这一目标? 问题答案: 巧合的是,大约3个小时前,我不得不做一些非常相似的事情。该表是3500万行,它相当宽,并且花了很多时间才能做到这一点: 这就是我最终得到的结果: 这次,这些陈述几乎是即时的。(在速度

  • 如何在PySpark中更改嵌套列的datatype?对于rxample,如何将value的数据类型从string更改为int? 参考:如何在pyspark中将Dataframe列从String类型更改为Double类型

  • 问题内容: 我正在尝试更改derby db列的数据类型。当前价格列设置为DECIMAL(5,0)。我想将其更改为DECIMAL(7,2)。我是这样做的: 但是它不起作用,并显示错误: 我可以知道如何进行更改吗?谢谢你。 问题答案: 这是Derby SQL脚本,用于将列MY_TABLE.MY_COLUMN从BLOB(255)更改为BLOB(2147483647):