【问题标题】:SQL Server 2008: Can not save because table must be deleted and newly created to save?SQL Server 2008:无法保存,因为必须删除表并重新创建才能保存?
【发布时间】:2011-05-10 04:34:39
【问题描述】:

我有点不理解的问题。

我正在使用 MS SQL Management Studio 2008。 我有一个带有表 X 的全新数据库。

X 有 3 列:

  • ID,唯一标识符,不为空
  • 用户名,nvarchar 50,不为空
  • 密码,nvarchar50,不为空

现在我保存。现在我将 ID 设置为主键 - 保存没问题。

现在我添加一列:Email, nvarchar 50, not null - 当我现在尝试保存时,我不能这样做,因为它告诉我保存表必须删除并重新创建。

我不明白这一点,我敢肯定,在 SQL Server 2005 中,添加这样的行很容易?!

【问题讨论】:

  • 您能否向我们展示您用来保存该行的代码(C#、VB.NET、T-SQL - 随便什么)?老实说,我不明白你真正在问什么......一些代码可能有助于理解你在做什么
  • 哦,是的,对不起,我的意思是列,我会编辑它。当然,我会添加列。

标签: sql-server


【解决方案1】:

【讨论】:

  • 谢谢,这有帮助,但你能解释一下原因吗?我不明白 - 严重。我会理解的。
  • @Kovu:解释请参考@Tim 回答。
【解决方案2】:

为了澄清 Damien_The_Unbeliever 所说的(编辑:我现在看到他已经扩展了他的回复),在添加 NOT NULL 约束之前,您输入的前几行在 EMAIL 列中没有任何值,因此将违反 NOT NULL 约束。首先,添加 EMAIL 列,允许空值。然后编辑现有行,使它们在该列中具有值。然后返回并将 NOT NULL 约束添加到 EMAIL 列。 或者,您可以在定义列时(临时)为 EMAIL 提供默认值,例如'temp@somedomain.com',现有行将获得该默认值(如果没有提供电子邮件,新行也将获得该默认值)。然后您可以返回并编辑它们。

简单地说,规则是这样的:如果有一行或多行违反了约束,则不能向已填充数据的表添加约束。

“约束”是您希望数据库强制执行的规则。

【讨论】:

    【解决方案3】:

    如果不指定列的默认值,则无法执行此操作 - 否则,SQL Server 将如何确保表中现有行的“非空”约束?

    如果你尝试通过查询来做,你会得到更多的解释:

    ALTER TABLE Table_2 ADD Email varchar(100) not null
    
    Msg 4901, Level 16, State 1, Line 1
    ALTER TABLE only allows columns to be added that can contain nulls, or have a DEFAULT definition specified, or the column being added is an identity or timestamp column, or alternatively if none of the previous conditions are satisfied the table must be empty to allow addition of this column. Column 'Email' cannot be added to non-empty table 'Table_2' because it does not satisfy these conditions.
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 2017-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      • 2014-01-14
      相关资源
      最近更新 更多