Так вот моя функция обновления:обновления каскадных таблиц с plpgsql
CREATE OR REPLACE FUNCTION api.book_update(
in_id BIGINT,
in_category VARCHAR,
in_published DATE,
in_author VARCHAR,
in_name VARCHAR
) RETURNS VOID AS $$
DECLARE
in_category_id BIGINT;
tmp BIGINT;
BEGIN
SELECT COUNT(*) INTO tmp FROM schemas.book;
IF (NOT (tmp <> 0)) THEN
RETURN;
END IF;
SELECT
category_id
INTO
in_category_id
FROM
schemas.book
WHERE
id = in_id;
SELECT category_id INTO tmp FROM schemas.category WHERE name = in_category;
IF (NOT FOUND)
THEN
SELECT nextval('schemas.category_category_id_seq') INTO tmp;
UPDATE schemas.book
SET
category_id = tmp,
published = in_published,
author = in_author,
name = in_name
WHERE
id = in_id;
INSERT INTO schemas.category (
category_id,
name
) VALUES (
tmp,
in_category
);
ELSE
SELECT category_id INTO tmp FROM schemas.category WHERE name = in_category;
UPDATE schemas.book
SET
category_id = tmp,
published = in_published,
author = in_author,
name = in_name
WHERE
id = in_id;
END IF;
END;
$$
LANGUAGE plpgsql;
терминального выход:
pgdb=# select * from api.book_add('aaa', '10-12-13', 'Aauthor','Name');
book_add
----------
(1 row)
pgdb=# select * from api.book_list;
id | category | published | author | name
----+----------+------------+---------+------
1 | aaa | 2013-10-12 | Aauthor | Name
(1 row)
pgdb=# select * from api.book_update(1, 'bbb', '10-12-13', 'Aauthor','Name');
ERROR: insert or update on table "category" violates foreign key constraint "category_category_id_fkey"
DETAIL: Key (category_id)=(2) is not present in table "book".
CONTEXT: SQL statement "INSERT INTO schemas.category (
category_id,
name
) VALUES (
tmp,
in_category
)"
PL/pgSQL function "book_update" line 31 at SQL statement
pgdb=#
Почему нет, когда я обновляю CATEGORY_ID к ТМПУ в «книге» и после вставки этого ТМП в «категории» таблицы
Вот полная схема script Предложения по нему очень ценится, так как я
Ваш весь ЕСЛИ НЕ НАЙДЕНО/ELSE логика не является необходимым, если вы делаете простой 'INSERT ... WHERE NOT EXISTS() 'first. UPDATE может быть «ОБНОВИТЬ книги ... ОТ категории», исключая переменную tmp и необходимость в plpgsql в целом. BTW - category_id серийный/bigserial тип данных? – wildplasser
Я только что нашел вашу схему. По-моему, у вас есть ограничение внешнего ключа, обратное, книги IMHO должны ссылаться на category.category_id, который является серийным, поэтому * не может * быть внешним ключом. (по крайней мере, это было бы очень сложно) – wildplasser
Пожалуйста, рассмотрите такую проблему, у меня есть две книги под категорией ccc, если я обновляю ccc до ddd для первой книги, вторая книга автоматически получает ddd, что неверно :( – juk