如何在同一SQL中将COLUMN更改为NOT NULL并添加PRIMARY KEY

时间:2017-03-31 05:48:21

标签: sql-server sql-server-2005

我的专栏my_id已设为varchar(50) NULL。现在我想将其更改为NOT NULL并将其添加为该表的primary key。由于还没有其他主键。 我写的如下。

ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;

ALTER TABLE my_details
ADD PRIMARY KEY (my_id); 

但是我收到了一个错误:

  

无法在表'my_details'中的可空列上定义PRIMARY KEY约束。无法创建约束。查看以前的错误。

如何为此编写单个查询?

4 个答案:

答案 0 :(得分:2)

只需在两个命令之间放置GO即可单独执行:

ALTER TABLE my_details
ALTER COLUMN my_id varchar(50) NOT NULL;

GO

ALTER TABLE my_details
ADD PRIMARY KEY (my_id); 

答案 1 :(得分:2)

使用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所提到的,您需要确保事先更新的列中没有NULL。

P.S。我无法直接重现错误,但已经看到它发生了(不幸的是在PROD上)。

答案 2 :(得分:0)

如果这是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

给你这个错误

  

消息515,级别16,状态2,行9无法将值NULL插入   栏' my_id',table' xStuff.dbo.my_details&#39 ;;列不允许   空值。更新失败。

尝试添加主键为您提供此

ALTER TABLE my_details
ADD PRIMARY KEY (my_id); 
GO
  

Msg 8111,Level 16,State 1,Line 16无法定义PRIMARY KEY   对表格中可空列的约束' my_details'。 Msg 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

答案 3 :(得分:0)

第一步:使您的列不为空 query-> alter table employee alter column emp_id整数NOT NULL;

2步骤:现在在更新列之后,将主键添加到该列中 查询-> alter table employee ADD PRIMARY KEY(emp_id);