[解決済み] Postgres ENUMデータ型またはCHECK CONSTRAINT?
質問
MySQL DB を Pg (9.1) に移行しており、Pg で新しいデータ型を作成し、それを列の定義として使用することによって MySQL ENUM データ型をエミュレートしています。質問ですが、CHECK CONSTRAINT を代わりに使用することはできますか、また、その方が良いですか?MySQL の ENUM 型は、行に特定の値のエントリを強制するために実装されています。そして、もしそうなら、それはより良い(または悪い)のでしょうか?
どのように解決するのですか?
ここでのコメントと回答、および初歩的な調査に基づいて、私は以下の要約を提供し、Postgres-eratiからのコメントを求めます。皆様のご意見をお聞かせください。
Postgresデータベースのテーブルカラムのエントリを制限する方法は3つあります。例えば、quot;colors" を格納するテーブルで、'red'、'green'、'blue' のみを有効な項目とする場合を考えてみましょう。
-
列挙型データ型
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
利点は、型を一度定義しておけば、あとは必要なだけのテーブルで再利用できることである。標準的な問い合わせは、ENUM型のすべての値をリストアップすることができ、アプリケーションフォームのウィジェットを作成するために使用することができます。
SELECT n.nspname AS enum_schema, t.typname AS enum_name, e.enumlabel AS enum_value FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'valid_colors' enum_schema | enum_name | enum_value -------------+---------------+------------ public | valid_colors | red public | valid_colors | green public | valid_colors | blue
デメリットは、ENUM型はシステムカタログに保存されるため、その定義を見るには上記のようなクエリーが必要になることです。これらの値は、テーブルの定義を見ただけではわからない。また、ENUM型は実際には内蔵のNUMERICやTEXTデータ型とは別のデータ型なので、通常の数値演算子や文字列演算子、関数は使えません。ですから、次のようなクエリはできません。
SELECT FROM t WHERE color LIKE 'bl%';
-
制約の確認
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
1つは、quot;what you see is what you get,"つまり、テーブル定義に列の有効値がそのまま記録されていること、2つは、すべてのネイティブな文字列および数値演算子が機能することです。
-
外部キー
CREATE TABLE valid_colors ( id SERIAL PRIMARY KEY NOT NULL, color TEXT ); INSERT INTO valid_colors (color) VALUES ('red'), ('green'), ('blue'); CREATE TABLE t ( color_id INTEGER REFERENCES valid_colors (id) );
基本的にはENUM型を作成するのと同じですが、ネイティブの数値演算子や文字列演算子が使えることと、有効な値を見つけるためにシステムカタログを照会する必要がないことが異なります。をリンクするために結合が必要です。
color_id
を目的のテキスト値に変換します。
関連
-
PostgreSQLのURL解決方法
-
Postgresqlのシーケンススキップの問題を解決する
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] postgres: ユーザーをスーパーユーザーにアップグレードしますか?
-
[解決済み] 'ユーザー "postgres" のパスワード認証に失敗しました'
-
[解決済み] PostgreSQL は設定/conf ファイルをどこに保存しますか?
-
[解決済み】Postgresのインストール時に入力したパスワードを忘れてしまいました。
-
[解決済み] Postgresデータベースの全テーブルを切り捨てる
-
[解決済み】psql: FATAL: ロール "postgres" が存在しない
-
[解決済み] Postgres ENUM 型のリスト
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
postgresql いくつかのメソッドは、要約の重複するデータを削除する
-
PostgreSQLがバキュームテーブルの情報を収集する必要があることを発見する方法
-
PostgreSQLの自己インクリメント構文使用上の注意点
-
postgresqlのjsonbデータの問い合わせと変更方法
-
[解決済み] 未知語からテキストへの変換関数の検索に失敗しました。
-
[解決済み] Postgres ENUMデータ型またはCHECK CONSTRAINT?
-
[解決済み] PostgreSQL 自動インクリメント
-
[解決済み] psql'に非対話的にパスワードを指定するには?
-
[解決済み] Postgres の全テーブルの行数を求めるには?
-
[解決済み] Postgres/SQLで2つの整数の最小値/最大値を取得する方法は?