修改数据表字段长度

时间:2022-08-16 14:32:41

前两天遇到这么件事,数据库某字段最初设计为6位但现在有8位的编号要存储。于是就想到了修改表字段的长度可是用

ALTER TABLE 表名 ALTER COLUMN 列名 varchar(16) not null

无法直接修改,这是什么问题啊?原来是欲修改的列名是主或外键。那只能这样先删除外键再删除主键再修改,修改完再先加主键后再加外键就OK啦。

--定义变量存储主外键
DECLARE @Constraint_Name varchar(128)
--查找某表外键
SELECT @Constraint_Name= Name
FROM dbo.sysobjects
WHERE Xtype = 'F' --“F”代表外键
and Parent_Obj =
(
SELECT [ID] FROM dbo.sysobjects WHERE id = OBJECT_ID(N'表名')
and OBJECTPROPERTY(OBJECT_ID(N'表名'), N'IsUserTable') = 1 )
PRINT @Constraint_Name
--删除原外键
EXEC ('ALTER TABLE 表名 DROP CONSTRAINT '+@Constraint_Name )


要是一张表有多个外键怎么办?上面的代码只能查出一个,下面的代码可解决:

--定义变量存储主外键
DECLARE @Constraint_Name varchar(128)
--查找RingResourceNoCheck表外键
SELECT @Constraint_Name=NAME FROM (
SELECT Name
FROM dbo.sysobjects
WHERE Xtype = 'F'
and Parent_Obj =
(
SELECT [ID] FROM dbo.sysobjects WHERE id = OBJECT_ID(N'表名')
and OBJECTPROPERTY(OBJECT_ID(N'表名'), N'IsUserTable') = 1 )
) AS Temptb WHERE NAME LIKE '%主表名' --好像外键的名字最后都跟的是主表的名称
PRINT @Constraint_Name
--删除原外键
EXEC ('ALTER TABLE 表名 DROP CONSTRAINT '+@Constraint_Name )

删除了外键接下来开始删除主键如下代码:

--查找某表主键
DECLARE @Constraint_Name varchar(128)
SELECT @Constraint_Name=Name
FROM dbo.sysobjects
WHERE Xtype = 'PK'
and Parent_Obj =
(
SELECT [ID] FROM dbo.sysobjects WHERE id = OBJECT_ID(N'表名')
and OBJECTPROPERTY(OBJECT_ID(N'表名'), N'IsUserTable') = 1 )
PRINT @Constraint_Name
--删除原主键
EXEC ('ALTER TABLE 表名 DROP CONSTRAINT '+@Constraint_Name )

下面可以修改字段的长度了

ALTER TABLE 表名 ALTER COLUMN 字段 varchar(长度) [not] null

最后再添加上主键和外键就可以了:

--添加主键
ALTER TABLE 表名 ADD CONSTRAINT PK_名称(一般为表名) PRIMARY KEY CLUSTERED (欲加主键的字段)
GO
--添加外键
ALTER TABLE 表名 ADD CONSTRAINT Fk_本表名_主表名 FOREIGN KEY (字段) REFERENCES 主表名(字段)

以前是本人遇到此类问题时的解决方法,若有不同欢迎指出共同学习。谢谢!