sql >> Databasteknik >  >> RDS >> PostgreSQL

konvertera MySQL SET-datatypen till Postgres

Du kan använda en array för kolumnen och en "innehålls av"-operator för CHECK-begränsningen:

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

Och så händer sådana här saker:

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

Detta tillåter {red,red} i kolumnen dock; om {red,red} inte tillåts är viktigt, då kan du lägga till en funktion för att kontrollera om det finns unika färgvärden i arrayen och justera CHECK-begränsningen:

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

Ett annat alternativ skulle vara en hög med associationstabeller med enkla skalära värden i kolumnerna. Detta kan dock vara besvärligt om du har sex av dessa kolumner. Du kan också använda Erwins version av funktionen om du behövde oroa dig för NULL i "uppsättningarna":

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. Kalkylblad kontra databaser:Är det dags att byta? Del 2

  2. ClusterControl CMON HA för distribuerad databas hög tillgänglighet - del två (GUI Access Setup)

  3. Byt namn på kolumn SQL Server 2008

  4. Hur MID() fungerar i MariaDB