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

但我得到了错误:

消息 5074,级别 16,状态 1,第 1 行
对象“DF_userTable_joinD_31EC6D26”依赖于列“joinDate”。
消息 4922,级别 16,状态 9,第 1 行
ALTER TABLE DROP COLUMN joinDate 失败,因为一个或多个对象访问此列。

为什么会这样?

另外,我想在插入新行时仅为 userName 列指定值,但是当我尝试这样做时:

INSERT userTable SELECT 'name1';

我收到错误消息:

消息 213,级别 16,状态 1,行 1
列名称或提供的值的数量与表定义不匹配。

为什么我会收到此错误?

4

1 回答 1

3

如果要删除列,首先需要删除约束。由于您没有费心命名约束,因此您需要找到它(例如,如果您没有在收到的错误消息中注意到它)。

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列,但这是例外而不是规则(我认为不应该允许它,因为它具有误导性)。

于 2012-05-16T13:58:58.440 回答