【问题标题】:the alter command conflicted with the check constraint (but no rows violate constraint)alter 命令与检查约束冲突(但没有行违反约束)
【发布时间】:2012-12-18 01:27:34
【问题描述】:

我正在尝试在 sql server 2008 上添加检查约束。运行此代码时出现以下错误:

alter table db.dbo.myTable add constraint
noWWWifProgramIsKnown check
(dbo.checkcountuniversalservice(A, B,
C)=0 and  program='WWW' )

引发错误:

ALTER TABLE 语句与 CHECK 约束冲突 “noWWWifProgramIsKnown”。数据库发生冲突 “db”,表“dbo.tableuniversalservice”。

Marc_s 对 SO 的回答说这很可能 b/c 某些行违反了约束: The ALTER TABLE statement conflicted

但是,没有行违反约束,因为这会返回 0:

select COUNT(*) from db.dbo.tableuniversalservice 
where
(dbo.checkcountuniversalservice(A, B, C)=0
and 
program='WWW'
)

我错过了什么?

【问题讨论】:

  • 以及表名,您的 SELECT 语句似乎与您想要的相反:您正在查询与 CHECK 条件匹配的行数,结果是零。所以要么表中没有行,要么都与CHECK 约束冲突。你可能想输入SELECT ... WHERE NOT (...)?

标签: sql sql-server sql-server-2008 tsql check-constraints


【解决方案1】:

我认为你的检查是向后的......为了让约束通过,它应该评估为TRUEUNKNOWN。您的SELECT 语句告诉您没有行符合约束,而不是告诉您没有行违反约束。

From MSDN:

CHECK 约束拒绝评估为 FALSE 的值。

【讨论】:

  • +1。但请更正:“为了让约束通过,它应该评估为 TRUEUNKNOWN
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-01
  • 2014-03-17
  • 2014-11-27
  • 1970-01-01
  • 2014-03-23
相关资源
最近更新 更多