我的专栏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约束。无法创建约束。查看以前的错误。
如何为此编写单个查询?
答案 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);