[解決済み] 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日の生産環境である場合、このように無計画に制約を削除することは本当に望ましいことではありません。数ミリ秒であっても、制約をもはや強制していない短いウィンドウがあり、誤った値がすり抜けることを許すかもしれません。これは意図しない結果を招く可能性があり、将来的にかなりのビジネスコストにつながる可能性があります。
関連
-
[解決済み] psql: FATAL: データベース "<user>" が存在しない
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] MySQLテーブルへの挿入または存在する場合の更新
-
[解決済み] MySQLで'insert if not exists'を行うにはどうしたらいいですか?
-
[解決済み] 各グループの上位1行を取得
-
[解決済み] 最新バージョンのOS X (Yosemite または El Capitan) をインストールした後に `pg_tblspc` が見つからない。
-
[解決済み】SQL Serverで既存のテーブルにデフォルト値を持つカラムを追加する
-
[解決済み】PostgreSQLのテーブルを作成した後、UNIQUE制約を追加することは可能ですか?
-
[解決済み】Postgresの一意制約とインデックス
-
[解決済み】MySQLで外部キー制約を追加できない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SQLラーニングノート--オペランドには1つのカラムが必要です。
-
[解決済み] SQLサーバーでNULL = NULLがfalseに評価される理由
-
[解決済み] MongoDBに "like "を使ってクエリを実行する方法
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] SQL Serverにおける関数とストアドプロシージャの比較
-
[解決済み] ある列の最大値を持つ行を取得する
-
[解決済み] PostgreSQLで一重引用符で囲まれたテキストを挿入する
-
[解決済み] 項目xにアクセスできるように文字列を分割するにはどうすればよいですか?
-
[解決済み] 複数の列に対してSELECT DISTINCTする方法(またはできる方法)は?
-
[解決済み] 主要なSQLデータベースでCREATE TABLEとALTER TABLEステートメントをロールバックすることは可能ですか?