我想在表“PRENOTAZIONE”中检查成人“n_adulti”的数量是否大于0并且小于表“APPARTAMENTO”中的成人“n_max_adulti”的最大数量。 这是表PRENOTAZIONE
create table PRENOTAZIONE (
id_prenotazione serial,
data_inizio date not null,
data_fine date not null,
n_adulti smallint default 1,
n_bimbi smallint default 0,
n_neonati smallint default 0,
n_ospiti_extra smallint default 0,
appartamento integer not null,
cliente varchar(255),
primary key(id_prenotazione),
foreign key (appartamento)
references APPARTAMENTO(id_appartamento),
foreign key (cliente)
references CLIENTE(email)
);
这是表APPARTAMENTO
create table APPARTAMENTO (
id_appartamento serial,
sconti_mensili real default 0,
sconti_settimanali real default 0,
n_camere_letto smallint default 0,
n_letti smallint default 0,
n_posti_letto smallint default 0,
n_bagni smallint default 0,
orario_check_in time not null,
orario_check_out time not null,
n_max_bimbi smallint not null,
n_max_neonati smallint not null,
n_max_adulti smallint not null,
tipo varchar(255) not null,
descrizione varchar(100) default ' ',
ospiti_extra smallint default 0,
cauzione real default 0,
costi_pulizia real default 0,
costo_bimbo real default 0,
costo_adulto real default 0,
servizio varchar(255),
indirizzo integer,
proprietario varchar(255),
tipologia integer,
termine_cancellazione smallint default 1,
primary key(id_appartamento),
foreign key (indirizzo)
references INDIRIZZO(id_indirizzo),
foreign key (termine_cancellazione)
references TERMINE_DI_CANCELLAZIONE(id_termine),
foreign key (proprietario)
references PROPRIETARIO(email),
foreign key (tipologia)
references TIPOLOGIA_APPARTAMENTO(id_tipologia),
foreign key (servizio)
references SERVIZIO(servizio)
);
这是我想做的检查操作
check ((n_adulti > 0) and (n_adulti <= (select n_max_adulti from APPARTAMENTO join PRENOTAZIONE on (id_appartamento = appartamento))))
and ((n_bimbi >= 0) and (n_bimbi <= (select n_max_bimbi from APPARTAMENTO join PRENOTAZIONE on (id_appartamento = appartamento))
and ((n_neonati > 0) and (n_neonati <= (select n_max_neonati from APPARTAMENTO join PRENOTAZIONE on (id_appartamento = appartamento)))))
但是在PostgreSQL中不幸的是不支持子查询......我需要用触发器来做这件事。 我在这看了一下:https://www.postgresql.org/docs/9.1/static/sql-createtrigger.html 和 https://www.tutorialspoint.com/postgresql/postgresql_triggers.htm 但我没找到我要找的东西...... 我不明白函数和触发器是如何协同工作的,我怎么能做这个功能。
PS:我很抱歉桌子的名字,但我是意大利人。然而,该数据库是受Airbnb启发的学校项目。 与Airbnb相比,目的是创建一个类似且简化的数据库。答案 0 :(得分:0)
创建一个调用以下PL / pgSQL trigger function的触发器BEFORE INSERT OR UPDATE ON prenotazione FOR EACH ROW
:
从属于n_max_bimbi
的{{1}}行中选择n_max_neonati
,n_max_adulti
和appartamento
。
如果NEW.appartamento
不在0和上面找到的NEW.n_adulti
之间,raise an appropriate exception。与其他人相似。