sql – 使用主键更改列数据类型

前端之家收集整理的这篇文章主要介绍了sql – 使用主键更改列数据类型前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在80多个不同的表中有一个ReferenceID varchar(6)列.在需要分配ID的政府组织实施更改后,我需要将此扩展到整个数据库中的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将取决于我们在哪个表中’目前正在关注?

解决方法

您需要在ALTER TABLE … ALTER COLUMN中明确指定NOT NULL,否则默认为允许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,State 9,Line 1
ALTER TABLE ALTER COLUMN ReferenceID Failed because one or more objects access this column.

在编程方法中需要考虑的几件事情是,您需要暂时删除任何引用ReferenceID列的外键,并确保不包含当前可为空的(非PK)ReferenceID列的NOT NULL.

猜你在找的MsSQL相关文章