[解決済み] Postgres SQL Exclusive OR (XOR) CHECK CONSTRAINT, is it possible?
2022-02-10 08:42:34
質問
XOR CHECK CONSTRAINTを作ることは可能ですか?
という名前のテストテーブルでやっています。 テスト で、3つのカラムがあります。
- id, ビッグインテグリティ
- a, bigint
- b, bigint
そのためのチェック制約を作りました。
(a IS NOT NULL AND b = NULL) OR (b IS NOT NULL AND a = NULL)
こんな感じでテストしてみました。
INSERT INTO public.test(
id, a, b)
VALUES (1, 1, 1);
ORの両側でTRUEと評価されないので、失敗するはずです。 しかし、うまく挿入されています。
実際にpostgresが制約として保存しているものを見てみると、このようになります。
(a IS NOT NULL AND b = NULL::bigint OR b IS NOT NULL AND a = NULL::bigint)
ORよりANDが優先されるそうなので、これでも大丈夫なはずです。
どなたか解決策をお持ちの方はいらっしゃいますか?できれば、3列以上でも可能なものがいいのですが。しかし、それらはより複雑になる可能性があることは理解しています。
編集:変更
= NULL
になります。
IS NULL
ください。
ERROR: cannot cast type boolean to bigint
解決方法は?
でNULL値を比較することはできません。
=
が必要です。
IS NULL
(a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL)
チェック制約の場合、式全体を括弧で囲む必要があります。
create table xor_test
(
id integer primary key,
a integer,
b integer,
check ((a IS NOT NULL AND b is NULL) OR (b IS NOT NULL AND a is NULL))
);
-- works
INSERT INTO xor_test(id, a, b) VALUES (1, null, 1);
-- works
INSERT INTO xor_test(id, a, b) VALUES (2, 1, null);
-- failse
INSERT INTO xor_test(id, a, b) VALUES (3, 1, 1);
あるいは、チェック制約を次のように簡略化することもできます。
check ( num_nonnulls(a,b) = 1 )
その分、カラム数が増えても調整しやすくなっています
関連
-
[解決済み] テーブルのFROM句の項目がない [終了しました] 。
-
[解決済み】テキストが切り捨てられた、または1つ以上の文字がターゲットコードページで一致しない アンピボットの主キーを含む
-
[解決済み】SQL ServerでIdentityカラムを更新する方法は?
-
[解決済み】Athena: スケールファクターでリソースを使い果たすクエリ
-
[解決済み】SQL Server: 無効なカラム名
-
[解決済み】sys.dm_exec_sql_textはどのように機能するのでしょうか?
-
[解決済み] SQLクエリで2つの列から値を引き算する
-
[解決済み] ORA-01821: ISO 8601 のローカルタイム付き日付のフォーマットが認識されないエラー
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。
-
[解決済み】NULL列を含む一意制約の作成
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 列名または提供された値の数がテーブル定義と一致しない
-
[解決済み】ストアドプロシージャーのエラー ORA-06550
-
[解決済み】BULK INSERTで「予期せぬファイルの終了」エラーが発生したROWを特定する?
-
[解決済み】一括読み込みデータ変換エラー(切り捨て)
-
[解決済み] SQLクエリ「00904. 00000 - "%s: 無効な識別子".
-
[解決済み] pg_restoreです。[archiver] 入力ファイルはテキスト形式のダンプであるように見えます。psql を使用してください。
-
[解決済み] Varchar は Sum 演算子では無効です。
-
[解決済み] ORA-04063: ビューにエラーがあります
-
[解決済み] エラー: 名前解析スクリプトで正しい関数に渡された長さのパラメーターが無効です。
-
[解決済み] SQLサーバーで文字列をsmalldatetimeデータ型に変換する際、変換に失敗しました(静的値を除く)。