sql >> Database teknologi >  >> RDS >> PostgreSQL

konverter MySQL SET datatype til Postgres

Du kan bruge et array til kolonnen og en "er indeholdt af"-operator for CHECK-begrænsningen:

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

Og så sker der ting som dette:

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

Dette vil tillade {red,red} i kolonnen dog; hvis du ikke tillader {red,red} er vigtigt, så kan du tilføje en funktion til at kontrollere for unikke farveværdier i arrayet og justere 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))
);

En anden mulighed ville være en bunke tilknytningstabeller med simple skalarværdier i kolonnerne. Dette kan dog være besværligt, hvis du har seks af disse kolonner. Du kunne også bruge Erwins version af funktionen, hvis du havde brug for at bekymre dig om NULL'er i "sættene":

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. Oracle Wait-begivenheder, som alle bør kende

  2. Dvalesekvens på oracle, @GeneratedValue(strategi =GenerationType.AUTO)

  3. Oracle SQL Analytisk forespørgsel - rekursiv regnearkslignende kørende total

  4. Sådan testes for overlappende datoer i PostgreSQL