sql >> Databáze >  >> RDS >> PostgreSQL

převést datový typ SET MySQL na Postgres

Můžete použít pole pro sloupec a operátor "je obsaženo v" pro omezení CHECK:

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

A pak se stanou věci jako toto:

=> 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)

To umožní {red,red} i když ve sloupci; pokud nepovolíte {red,red} je důležité, pak byste mohli přidat funkci pro kontrolu jedinečných hodnot barev v poli a upravit omezení 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))
);

Další možností by byla hromada asociačních tabulek s jednoduchými skalárními hodnotami ve sloupcích. To však může být těžkopádné, pokud máte šest těchto sloupců. Můžete také použít Erwinovu verzi funkce, pokud byste se potřebovali starat o NULL v "sadách":

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. Volání notace pro podprogramy PL/SQL v databázi Oracle

  2. Oracle:Co dělá `(+)` v klauzuli WHERE?

  3. Oracle Update Query pomocí Join

  4. kódování UTF8 neodpovídá národnímu prostředí en_US; zvolené nastavení LC_CTYPE vyžaduje kódování LATIN1