1. ホーム
  2. sql

[解決済み] Postgres。制約が存在しない場合、制約を追加する

2022-11-27 10:22:29

質問

Postgresには、以下のような方法がありますか? ALTER TABLE foo ADD CONSTRAINT bar ... というような、制約がすでに存在する場合にコマンドを無視し、エラーを発生させないような方法はありますか?

どのように解決するのですか?

ちょっと汚いハックかもしれませんが、これが役に立つかもしれません。

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 ...;

開発用データベースや、メンテナンスウィンドウのためにこのデータベースに依存しているアプリをシャットアウトできることが分かっているところでは、おそらく問題ないでしょう。

しかし、これが活発なミッションクリティカルな24時間365日の生産環境である場合、このように無計画に制約を削除することは本当に望ましいことではありません。数ミリ秒であっても、制約をもはや強制していない短いウィンドウがあり、誤った値がすり抜けることを許すかもしれません。これは意図しない結果を招く可能性があり、将来的にかなりのビジネスコストにつながる可能性があります。