如何在postgresql中创建检查函数?
我想在表“PRENOTAZIONE”中检查成人“n_adulti”的数量是否大于0,并且小于表“APPARTAMENTO”中成人“n_max_adulti”的最大数量。 这是PRENOTAZIONE的桌子如何在postgresql中创建检查函数?,postgresql,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 s
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)
);
这是桌子
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)))))
检查((n_adulti>0)和(n_adulti=0)和(n_bimbi 0)和(n_neonati为每行插入或更新prenotazione之前创建一个触发器,该触发器调用以下PL/pgSQL:
- 从属于
NEW.appartamento
的appartamento
行中选择n\u max\u bimbi
、n\u max\u neonati
和n\u max\u adulti
- 如果
NEW.n\u adulti
不在0和上面找到的n\u max\u adulti
之间,则与其他类似
我忘了说,尽管您可以理解,PRENOTAZIONE中的appartamento引用了appartamento中的id\u appartamento