sql >> Database >  >> RDS >> PostgreSQL

converteer MySQL SET-gegevenstype naar Postgres

Je zou een array kunnen gebruiken voor de kolom en een "is bevat door" operator voor de CHECK-beperking:

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

En dan gebeuren dit soort dingen:

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

Hierdoor zal {red,red} in de kolom wel; als u {red,red} niet toestaat belangrijk is, kunt u een functie toevoegen om te controleren op unieke kleurwaarden in de array en de beperking CHECK aanpassen:

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

Een andere optie is een stapel associatietabellen met eenvoudige scalaire waarden in de kolommen. Dit kan echter omslachtig zijn als u zes van deze kolommen heeft. Je kunt ook Erwin's versie van de functie gebruiken als je je zorgen moet maken over NULL's in de "sets":

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. DAY() Voorbeelden – MySQL

  2. Hoe u meer dan 1000 waarden in een Oracle IN-clausule plaatst?

  3. Hoeveel impact kan een datatypekeuze hebben?

  4. De Eager Index Spool en de Optimizer