34,588
社区成员
发帖
与我相关
我的任务
分享
create table tb(a text)
insert into tb values ('aaaaaa')
go
alter table tb alter column a char(255)
go
select * from tb
drop table tb
---结果集
(1 row(s) affected)
a
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
aaaaaa
(1 row(s) affected)
--直接执行报错
alter table mas alter column ida varchar(20)
go
/*
服务器: 消息 5074,级别 16,状态 8,行 5
对象 'PK_mas' 依赖于 列 'ida'。
服务器: 消息 4922,级别 16,状态 1,行 5
ALTER TABLE ALTER COLUMN ida 失败,因为有一个或多个对象访问此列。
*/
--删除所有外键引用
ALTER TABLE [dbo].[sub] DROP CONSTRAINT [FK_sub_mas]
--删除主键
ALTER TABLE [dbo].[mas] DROP CONSTRAINT [PK_mas]
--修改主表
alter table mas alter column ida varchar(20) not null--注意主键要加 not null
--修改所有引用表
alter table sub alter column ida varchar(20)
--恢复主键
ALTER TABLE [dbo].[mas] ADD CONSTRAINT [PK_mas] PRIMARY KEY CLUSTERED ([ida]) ON [PRIMARY]
--恢复所有外键
ALTER TABLE [dbo].[sub] ADD CONSTRAINT [FK_sub_mas] FOREIGN KEY([ida]) REFERENCES [mas] ([ida])
select
convert(varchar(20),(select name from dbo.sysobjects where id = a.constid)) as 外键名称,
convert(varchar(20), (select name from dbo.sysobjects where id = a.fkeyid)) as 引用表,
convert(varchar(20), (select name from dbo.sysobjects where id = a.rkeyid)) as 主表
from dbo.sysforeignkeys a
where rkeyid in(select id from dbo.sysobjects where name = '主表名称')