Это может помочь, хотя это может быть немного грязным взломом:
create or replace function create_constraint_if_not_exists (
t_name text, c_name text, constraint_sql text
)
returns void AS
$$
begin
-- Look for our constraint
if not exists (select constraint_name
from information_schema.constraint_column_usage
where table_name = t_name and constraint_name = c_name) then
execute constraint_sql;
end if;
end;
$$ language 'plpgsql'
Затем вызовите с:
SELECT create_constraint_if_not_exists(
'foo',
'bar',
'ALTER TABLE foo ADD CONSTRAINT bar CHECK (foobies < 100);')
Обновлено:
В соответствии с ответом Webmut ниже с предложением:
ALTER TABLE foo DROP CONSTRAINT IF EXISTS bar;
ALTER TABLE foo ADD CONSTRAINT bar ...;
Это, вероятно, хорошо в вашей базе данных разработки, или там, где вы знаете, что вы можете отключить приложения, которые зависят от этой базы данных дляокно обслуживания.
Но если это живая критически важная производственная среда 24x7, то вам не стоит отказываться от подобных ограничений.Даже на несколько миллисекунд есть короткое окно, в котором вы больше не применяете ограничение, которое может позволить ошибочным значениям проскальзывать.Это может иметь непредвиденные последствия, приводящие к значительным издержкам бизнеса в какой-то момент в будущем.