Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将列更改为NOTNULL并在同一SQL中添加主键_Sql Server_Sql Server 2005 - Fatal编程技术网

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)

可能的重复项您不能在单个查询中执行此操作-您需要两个步骤-第一步将列转换为
非空
,第二步,将主键约束添加到具有新的不可空列的表中