2013-11-19 5 views
2

Мне нужно добавить ограничение к таблице, чтобы столбец ab всегда был больше столбца h. Я попыталсяAdd Check Ограничение не работает SQL

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 он работает только с ключами.

EDIT:

Итак, как было отмечено, есть случаи, когда аб = ч, однако есть способ, чтобы исключить существующие строки из ограничений?

+3

могут быть некоторые существующие строки, где ab = h ?? – BWS

+0

@BWS есть около 6000 строк, где ab = h (попадает на стол, чтобы не видеть очевидного) – thermite

+1

Вы можете добавить столбец 'is_old' в таблицу, а затем проверить' ab> h или is_old' –

ответ

4

Вы должны проверить значения, где ab = h. Я уверен, что вы найдете свою проблему.

См. Ниже один пример его работы.

sqlfiddle demo

+1

, около 6000 строки, где ab = h (попадает на стол, чтобы не видеть очевидного). – thermite

+0

Происходит к лучшему: p. –

+0

@thermite. Я не понимал, что вы отредактировали свой вопрос. Что вы, mena, исключаете строки из ограничения? Ограничение будет установлено для всех строк. Ваши два варианта меняют ваше ограничение на ab> = h или удаляют/обновляют строки, которые нарушают исходный cosntraint –

3

Если вы хотите столбец аб всегда больше, чем колонки часов, то вам нужно удалить эти 6000 строк, где аб = Л, если не хотите, чтобы удалить эти 6000 строк, вы можете попробовать это.

ALTER TABLE batting 
ADD constraint possibleHits check(ab>=h); 
Смежные вопросы