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

MySQLSETデータ型をPostgresに変換します

    列に配列を使用し、CHECK制約に「含まれる」演算子を使用できます。

    create table pancakes (
        color varchar(10)[] not null,
        check (color <@ ARRAY['red', 'green', 'blue']::varchar[])
    );
    

    そして、このようなことが起こります:

    => insert into pancakes values (ARRAY['red']);
    INSERT 0 1
    => insert into pancakes values (ARRAY['red','green','blue']);
    INSERT 0 1
    => insert into pancakes values (ARRAY['red','green','blue','black']);
    ERROR:  new row for relation "pancakes" violates check constraint "pancakes_color_check"
    => select * from pancakes;
          color       
    ------------------
     {red}
     {red,green,blue}
    (2 rows)
    

    これにより、{red,red}が許可されます しかし、列に; {red,red}を許可しない場合 重要な場合は、配列内の一意の色の値をチェックし、CHECK制約を調整する関数を追加できます。

    create function has_unique_colors(varchar[]) returns boolean as $$
        select (select count(distinct c) from unnest($1) as dt(c)) = array_length($1, 1);
    $$ language sql;
    
    create table pancakes (
        color varchar(10)[] not null,
        check (color <@ ARRAY['red', 'green', 'blue']::varchar[] and has_unique_colors(color))
    );
    

    別のオプションは、列に単純なスカラー値を持つ関連付けテーブルの山です。ただし、これらの列が6つある場合、これは面倒な場合があります。 「セット」のNULLについて心配する必要がある場合は、Erwinのバージョンの関数を使用することもできます。

    create function has_unique_colors(varchar[]) returns boolean as $$
        select not exists(select c from unnest($1) dt(c) group by 1 having count(*) > 1);
    $$ language sql;
    



    1. MySQLで列の名前を変更中にエラーが発生しました

    2. ストアドプロシージャの結果セット(T-SQL)から列のサブセットを選択する方法

    3. オペランドには1つの列が含まれている必要があります-MySQLはありません

    4. MariaDBでのCURDATE()のしくみ