Как узнать, есть ли журнал в таблице magazine
? Колонка issn
определяет журнал? Если да, то это должен быть первичный ключ или, по крайней мере, unique
.
Самый простой способ - проверить наличие журнала в вашем клиентском приложении, например так (в псевдокоде):
function insert_issue(longname, shotname, issn, number,year,volume) {
/* extensive comments for newbies */
start_transaction();
q_get_magazine_id = prepare_query(
'select magazine_id from magazine where issn=?'
);
magazine_id = execute_query(q_get_magazine_id, issn);
/* if magazine_id is null now then there’s no magazine with this issn */
/* and we have to add it */
if ( magazine_id == NULL ) {
q_insert_magazine = prepare_query(
'insert into magazine (longname, shotname, issn)
values (?,?,?) returning magazine_id'
);
magazine_id = execute_query(q_insert_magazine, longname, shortname, issn);
/* we have tried to add a new magazine; */
/* if we failed (magazine_id==NULL) then somebody else just added it */
if ( magazine_id == NULL ) {
/* other, parerelly connected client just inserted this magazine, */
/* this is unlikely but possible */
rollback();
start_transaction();
magazine_id = execute_query(q_get_magazine_id, issn);
}
}
/* now magazine_id is an id of magazine, */
/* added if it was not in a database before, new otherwise */
q_insert_issue = prepare_query(
'insert into issue (fk_magazine_id,number,year,volume)
values (?,?,?,?)'
);
execute_query(q_insert_issue, magazine_id, number, year, volume);
/* we have inserted a new issue referencing old, */
/* or if it was needed new, magazine */
if ( ! commit() ) {
rollback();
raise "Unable to insert an issue";
}
}
Если вам просто нужно сделать это в одном запросе, вы можете реализовать этот псевдокод как функцию pl / pgsql в базе данных и просто select insert_issue(?, ?, ?, ?, ?, ?)
.