2012-05-16 80 views
0

我创建了一个表:用默认约束删除列

create table userTable 
(
    userId int identity(1,1) not null, 
    userName nvarchar(20) not null, 
    joinDate datetime not null default getdate() 
     constraint pk_userTable primary key(userId) on [primary] 

) 

然后我试图删除列joinDate:

alter table userTable drop column joinDate 

但我得到的错误:

Msg 5074, Level 16, State 1, Line 1
The object 'DF_userTable_joinD_31EC6D26' is dependent on column 'joinDate'.
Msg 4922, Level 16, State 9, Line 1
ALTER TABLE DROP COLUMN joinDate failed because one or more objects access this column.

这是为什么呢?

另外,我想插入新行时,只输入用户名列中指定的值,但是当我尝试这样做:

INSERT userTable SELECT 'name1'; 

我得到的错误信息:

Msg 213, Level 16, State 1, Line 1
Column name or number of supplied values does not match table definition.

为什么我得到这个错误?

+1

你想删除joinDate,但你仍然想使用它?这没有意义。另外,如果只插入一个userName,那么你有一个默认值getdata(),它将填充joinDate字段。 –

回答

1

如果要删除该列,首先需要删除该约束。既然你没有打算命名约束,你需要找到它(例如,如果你没有注意到你收到的错误信息)。

DECLARE @sql NVARCHAR(4000); 

SELECT @sql = 'ALTER TABLE userTable DROP CONSTRAINT ' + QUOTENAME(dc.name) + ';' 
    FROM sys.default_constraints AS dc 
    INNER JOIN sys.columns AS c 
    ON dc.parent_object_id = c.[object_id] 
    AND dc.parent_column_id = c.column_id 
    WHERE parent_object_id = OBJECT_ID('dbo.userTable') 
    AND c.name = 'joinDate'; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
-- ALTER TABLE userTable DROP COLUMN joinDate; 

编辑

如果要插入此表中,而不硬编码值的joinDate列,你不能只是说:

INSERT userTable SELECT 'name1'; 

您将得到列列表不匹配表定义或类似的错误。所以如果你想插入到一个列的子集中,你需要命名这些列。

INSERT userTable(userName) SELECT 'name1'; 

懒惰和留出列清单适用于IDENTITY列但这是例外而不是规则(我不觉得,因为它是误导,应该被允许)。

+0

谢谢Aaron Bertrand的回复。至于我的第二部分查询和评论。我做了:插入userTable select'name1' union all select'name2'但我得到的错误:插入错误:提供的值的列名或数量与表定义不匹配。 – nischal

+0

我更新了我的答案和问题,使第二个问题更加清晰(我不是唯一一个被它困惑的人)。本质上,如果您只想插入列的子集,则需要在插入列表中命名这些列。否则,SQL Server不能理解你的意思。 –

+0

感谢您的快速回复。它解决了我的问题。 – nischal