我有一张桌子:
MyTable{
Id int not null;
Name varchar not null;
TypeId int null;
}
现在我想让我的TypeId
列为not null
首先填写数据:
update [dbo].[MyTable]
set [dbo].[MyTable].[TypeId] = 1
where [dbo].[MyTable].[TypeId] is null
并设置为非空:
go
ALTER TABLE [dbo].[MyTable] ALTER COLUMN [TypeId] BIT NOT NULL;
但是得到一个错误:
Msg 5074, Level 16, State 1, Line 1
The object 'FK_MyTable_ObjTypes' is dependent on column 'TypeId'.
Msg 4922, Level 16, State 9, Line 1
ALTER TABLE ALTER COLUMN TypeId failed because one or more objects access this column.
在这种情况下该怎么办?如果列是FK,我不能在表后使用吗?
我尝试过禁用constreints:
GO
ALTER TABLE [dbo].[MyTable] NOCHECK CONSTRAINT [FK_MyTable_ObjTypes];
go
ALTER TABLE [dbo].[MyTable] ALTER COLUMN [TypeId] BIT NOT NULL;
GO
ALTER TABLE [dbo].[MyTable] CHECK CONSTRAINT [FK_MyTable_ObjTypes];
但得到同样的错误。
删除并重新创建约束可以帮助我。这是我的问题:
GO
ALTER TABLE [dbo].[MyTable] DROP CONSTRAINT [FK_MyTable_ObjTypes];
go
ALTER TABLE [dbo].[MyTable] ALTER COLUMN [TypeId] INT NOT NULL;
GO
ALTER TABLE [dbo].[MyTable] WITH NOCHECK
ADD CONSTRAINT [FK_MyTable_ObjTypes] FOREIGN KEY ([TypeId]) REFERENCES [dbo].[ObjTypes] ([Id]);
GO
ALTER TABLE [dbo].[MyTable] WITH CHECK CHECK CONSTRAINT [FK_MyTable_ObjTypes];
答案 0 :(得分:4)
您的外键FK_MyTable_ObjTypes
引用了TypeId
列,因此更改列会使FK的约束无效。
您需要先删除FK(将其编写为CREATE
,以便查看现有定义)。然后ALTER
您的列,然后使用新修改的列重新创建FK。
答案 1 :(得分:3)
Yo可以禁用FK'FK_MyTable_ObjTypes',更改列并再次启用FK:
How can foreign key constraints be temporarily disabled using T-SQL?