Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中创建检查函数?_Postgresql - Fatal编程技术网

如何在postgresql中创建检查函数?

如何在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

我想在表“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) 
);
这是桌子

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