【问题标题】:Postgres9.6 - column with array of elements referencing already created elementsPostgres9.6 - 包含引用已创建元素的元素数组的列
【发布时间】:2018-10-16 13:12:26
【问题描述】:

我有这种情况:

我有一个名为Airports 的表,它需要有一组航空公司,代表航空公司在所述机场有哪些航班。自然,我想让这样的数组的每个值都与现有的航空公司相匹配。

有没有办法使用数组来完成这个?如果是这样,那么干净的方法是什么?

【问题讨论】:

标签: sql database postgresql extended-sql


【解决方案1】:

我找到了解决这个问题的方法,使用一个存储函数来检查数组中的每个元素是否对应于一个已经存在的航空公司。

在代码中

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

这样,每次插入或更新机场时,都会检查航空公司。如果数组中有不存在的航空公司则失败

【讨论】: