尝试向现有表添加约束时出现“无法创建默认约束”的错误。

13

我想在SQL Server中使用 ALTER TABLE 添加默认约束,但是我收到了以下错误消息:

表'Register'中的列'StartDate'无法用于创建默认约束。

我知道我可以在创建表时声明约束,但那不是我现在所处的情况。希望有人能帮助我 ;)

这是我的 alter 语句:

ALTER TABLE [dbo].[Register]
  ADD CONSTRAINT [Register_StartDate] DEFAULT (GETDATE()) FOR StartDate 

这是我的创建表脚本:

CREATE TABLE [dbo].[Register]
  (
     [ID]        [INT] IDENTITY(1, 1) NOT NULL,
     /* ....*/
     [StartDate] [DATETIME] NULL
  ) 

编辑:修复了问题:我忘记在表中[StartDate]字段根本不存在。我的错!


对我来说它运行良好。 - Abhishek Jain
1
无法重现 - 必须有其他问题。您是否(a)在正确的数据库中,(b)确定您的“Register”表确实是这样创建的,并且(c)该表中的“StartDate”确实是“DATETIME”? - marc_s
你尝试在创建列时添加默认约束了吗?那样行不行? - Nilesh
我刚刚意识到我甚至没有在表中创建列名。谢谢,伙计们! - TechCrave
1
这对我很有帮助,但应该以问答格式进行格式化,请参阅常见问题解答。 - kristianp
尽管最终的解决方案已经添加到了问题中,但我还是添加了一个答案,以便将其从未回答的问题列表中移除。此外,对于未来的谷歌搜索者,还有另一个潜在的解释。 - Martin Smith
2个回答

13
据我所知,可能有两种情况会导致此错误。
尝试将默认约束添加到:
  1. 计算列。
  2. 根本不存在的列!
对于表定义。
CREATE TABLE dbo.Register
  (
     ID INT IDENTITY(1, 1) NOT NULL,
     Computed AS 'Foo'
  ) 

以下两个语句都会因错误码1752而失败。

ALTER TABLE dbo.Register
  ADD CONSTRAINT C1 DEFAULT 'X' FOR Computed

ALTER TABLE [dbo].[Register]
  ADD CONSTRAINT [Register_StartDate] DEFAULT (GETDATE()) FOR StartDate 

还有各种其他条件不允许向列添加默认约束,但这些都有自己独特的错误编号和消息。

+------------------------------------+--------------+
|               Reason               | Error number |
+------------------------------------+--------------+
| Column is IDENTITY                 |         1754 |
| Column is timestamp/rowversion     |         1755 |
| Sparse Column                      |         1791 |
| Default constraint already present |         1781 |
+------------------------------------+--------------+

0

错误 1752 表示约束定义中引用的列名不存在。 请检查该列是否存在于表中,或者我们是否在默认约束定义中引用了错误的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接