添加检查约束不工作SQL

时间:2013-11-19 19:46:01

标签: sql postgresql check-constraints

我需要在表中添加约束,以使列ab始终大于列h。我试过了

ALTER TABLE batting
ADD constraint possibleHits check (ab>h);

但是返回

ERROR:  check constraint "possiblehits" is violated by some row

********** Error **********

ERROR: check constraint "possiblehits" is violated by some row
SQL state: 23514

是一个错误。

我跑了

select * from batting where ab<h

并且它不返回任何行。

关于我做错的任何想法?或者有办法做一些像添加

的事情
NOT VALID

到语句,以便它不会对现有行强制执行约束? 我知道这在mysql中有效,但在postgres中它只适用于键。

编辑:

正如所指出的,有些情况下ab = h但是有没有办法从约束中排除现有的行?

2 个答案:

答案 0 :(得分:4)

您应该检查ab = h的值。我相信你会找到你的问题。

请参阅下面的一个工作示例。

sqlfiddle demo

答案 1 :(得分:3)

如果你想列ab总是大于列h,那么你需要删除那些ab = h的6000行,如果不想删除这6000行,你可以试试这个。

 ALTER TABLE batting
 ADD constraint possibleHits check(ab>=h);