Sql server 如何将列更改为NOTNULL并在同一SQL中添加主键
我有一个列Sql server 如何将列更改为NOTNULL并在同一SQL中添加主键,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个列my_id,它已经设置为varchar(50)NULL。现在,我想将它改为notnull,并将其添加为该表的主键。因为还没有其他主键。 我写的如下 ALTER TABLE my_details ALTER COLUMN my_id varchar(50) NOT NULL; ALTER TABLE my_details ADD PRIMARY KEY (my_id); 但我有一个错误: 无法在表“my_details”中的可空列上定义主键约束。无法创建约束。请参阅前面的错误 如何
my_id
,它已经设置为varchar(50)
NULL
。现在,我想将它改为notnull
,并将其添加为该表的主键。因为还没有其他主键。
我写的如下
ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;
ALTER TABLE my_details
ADD PRIMARY KEY (my_id);
但我有一个错误:
无法在表“my_details”中的可空列上定义主键约束。无法创建约束。请参阅前面的错误
如何为此编写单个查询 只需在两个命令之间放置一个GO
,即可分别执行它们:
ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;
GO
ALTER TABLE my_details
ADD PRIMARY KEY (my_id);
如果这是一个在my_id列中有空值的现有表,则必须首先更新该列以删除空值
CREATE TABLE my_details ( my_id varchar(50) NULL )
GO
INSERT INTO dbo.my_details ( my_id ) VALUES (NULL )
GO
ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;
GO
给你这个错误
Msg 515,16级,状态2,第9行不能将值NULL插入
列'my_id',表'xStuff.dbo.my_details';列不允许
空值。更新失败
尝试添加主键会产生以下结果
ALTER TABLE my_details
ADD PRIMARY KEY (my_id);
GO
Msg 8111,级别16,状态1,第16行无法定义主键
表“my_details”中可为空的列上的约束。味精1750,水平
16,状态0,第16行无法创建约束。请参阅前面的错误
然而
在两者之间放置更新,此更改生效
CREATE TABLE my_details ( my_id varchar(50) NULL );
GO
INSERT INTO dbo.my_details ( my_id ) VALUES (NULL );
GO
UPDATE dbo.my_details SET my_id = '' WHERE my_id IS NULL;
GO
ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;
GO
ALTER TABLE my_details
ADD PRIMARY KEY (my_id);
GO
使用GO并不总是一个选项,例如在存储过程中
我的解决方法是使用动态SQL绕过过度、过早的模式验证:
create table #test(ID int not null, ForeignKeyID int null)
alter table #test alter column ForeignKeyID int not null
exec ('alter table #test add primary key(ID, ForeignKeyID)')
当然,正如Cool_Br33ze所提到的,您需要确保事先更新的列中没有空值
另外,我无法直接复制错误,但已经看到它发生了(不幸的是在PROD上)。1步骤:使列不为空
查询->更改表员工更改列emp\U id整数不为空
第2步:现在更新列后,将主键添加到该列中
查询->更改表添加主键(emp_id) 可能的重复项您不能在单个查询中执行此操作-您需要两个步骤-第一步将列转换为非空
,第二步,将主键约束添加到具有新的不可空列的表中