如何在postgresql中创建检查功能?

时间:2017-05-30 08:43:52

标签: postgresql

我想在表“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.htmlhttps://www.tutorialspoint.com/postgresql/postgresql_triggers.htm 但我没找到我要找的东西...... 我不明白函数和触发器是如何协同工作的,我怎么能做这个功能。

PS:我很抱歉桌子的名字,但我是意大利人。然而,该数据库是受Airbnb启发的学校项目。 与Airbnb相比,目的是创建一个类似且简化的数据库。

1 个答案:

答案 0 :(得分:0)

创建一个调用以下PL / pgSQL trigger function的触发器BEFORE INSERT OR UPDATE ON prenotazione FOR EACH ROW

  • 从属于n_max_bimbi的{​​{1}}行中选择n_max_neonatin_max_adultiappartamento

  • 如果NEW.appartamento不在0和上面找到的NEW.n_adulti之间,raise an appropriate exception。与其他人相似。