sql >> データベース >  >> RDS >> PostgreSQL

PostgresENUMデータ型またはCHECKCONSTRAINT?

    ここでのコメントと回答、およびいくつかの基本的な調査に基づいて、Postgres-eratiからのコメントを提供するために次の要約があります。ご意見をいただければ幸いです。

    Postgresデータベーステーブル列のエントリを制限する方法は3つあります。 「赤」、「緑」、または「青」のみを有効なエントリにする「色」を格納するテーブルについて考えてみます。

    1. 列挙型データ型

      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%'; 
      
    2. 制約を確認する

      CREATE TABLE t (
          colors TEXT CHECK (colors IN ('red', 'green', 'blue'))
      );
      

      2つの利点は、1つは「表示されるものは取得するもの」、つまり列の有効な値がテーブル定義に直接記録されること、2つはすべてのネイティブ文字列または数値演算子が機能することです。

    3. 外部キー

      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をリンクするには、結合が必要です 目的のテキスト値に変更します。



    1. データベースの効率を高めるための主な方法

    2. SQLiteを持っている

    3. PL / SQLおよびSQLでのVARCHAR2の最大サイズはいくつですか?

    4. Oracleで2列のデータをA、B形式で取得する方法