如何设置列NOT NULL?

时间:2015-03-31 10:30:53

标签: sql sql-server

我有一张桌子:

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];

2 个答案:

答案 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?