Postgres9.6 - столбец с массивом элементов, ссылающихся на уже созданные элементы - PullRequest
0 голосов
/ 06 мая 2018

У меня такая ситуация:

У меня есть таблица с именем Airports, в которой должен быть массив Авиакомпаний, представляющий, какие авиакомпании выполняют рейсы в указанном аэропорту. Естественно, я бы хотел, чтобы каждое значение такого массива совпадало с существующей авиакомпанией.

Есть ли способ сделать это с помощью массивов? И если да, то какой будет чистый способ сделать это?

1 Ответ

0 голосов
/ 07 мая 2018

Я нашел способ решить эту проблему, используя сохраненную функцию, которая проверяет, соответствует ли каждый элемент в массиве уже существующей авиакомпании.

В коде

-- tipo para aeropuerto
create type taeropuerto as (
    nombre varchar(90),
    ubicacion tubicacionAeorpuerto,
    medidas tmedidasPista,
    aerolineas oid[]
);

-- Aerolineas
create type taerolinea as (
    nombre varchar(100)
);

-- tabla correspondiente
create table aerolinea of taerolinea
(primary key(oid))
with oids;
-- function para chequear que cada aerolinea insertada sea correcta
create or replace function check_aerolineas(aerolineas oid[]) returns boolean as 
$$
declare
    aerolineas_tbl record;
    o oid;
    valido boolean;
begin
    valido = true;
    foreach o in array aerolineas loop
        valido = valido and (o in (select oid from aerolinea));
    end loop;
    return valido;
end;
$$ language plpgsql;

create table aeropuerto of taeropuerto (
    constraint aerolineas_check check(check_aerolineas(aerolineas))
);

Таким образом, при каждом добавлении или обновлении аэропорта будут проверяться авиакомпании. Сбой, если в массиве есть несуществующая авиакомпания

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...