Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в rules для view двух связанных таблиц добавить id внешнего ключа? / 4 сообщений из 4, страница 1 из 1
29.05.2016, 18:12
    #39245713
max_lbnv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в rules для view двух связанных таблиц добавить id внешнего ключа?
Здравствуйте, уважаемые проектировщики! Только начинаю работать с PostrgeSQL и не могу разобраться, как грамотно создавать представления и правила _insert для связанных таблиц, а именно, как правильно добавлять внешний ключ записям дочерней таблицы. Вот пример:
Есть две таблцы:
CREATE TABLE orders (
id SERIAL PRIMARY KEY,
desc TEXT NOT NULL
);
CREATE TABLE customers(
id SERIAL PRIMARY KEY,
order_id INT NOT NULL REFERENCES orders(id),
fname TEXT NOT NULL,
lname TEXT NOT NULL
);

Работать с ними можно только через вьюху. Создаю нечто, вроде:

CREATE OR REPLACE VIEW vw_orders_customers AS
SELECT orders.id as orders_id, orders.desc as desc,
customers.id as customer_id, customers.fname as fname, customers.lname as lname, customers.order_id as order_id
FROM orders, customers
WHERE orders.id = customers.order_id;

Задача добавления следующая: добавляется один заказ и к нему сразу добавляются один (или несколько) клиентов.

Пробую создать правило на insert:
CREATE OR REPLACE RULE _insert AS ON INSERT TO vw_orders_customers DO INSTEAD (
INSERT INTO orders (desc)
VALUES (NEW.desc);
INSERT INTO customers (fname, lname, order_id)
VALUES (new.fname, new.lname, SELECT currval('orders_id_seq'))
RETURNING
SELECT currval('orders_id_seq'), (SELECT desc FROM orders WHERE id = SELECT currval('orders_id_seq')),
customers.id, customers.fname, customers.lname, customers.order_id)
);

Но я явно что-то делаю не так... Сейчас проблема с обращением к последовательностям по currval(). До этого пробовал что-то вроде: select MAX(id) from orders =) Удивительно, но так insert работал, правда в order_id добавлял всегда id первой строки таблицы (в хронологическом порядке, независимо от сортировки по ORDER).
Подскажите, пожалуйста, как правильно создавать вьюхи и правила на insert для связанных таблиц или где хотя-бы про это почитать? Как действовать в этом конкретном случае?
...
Рейтинг: 0 / 0
30.05.2016, 11:05
    #39246015
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в rules для view двух связанных таблиц добавить id внешнего ключа?
max_lbnv,

вам черным по белому говорять -- не пользуйтеся рулями, пользуйтеся инстеад--офф--триггерами:

https://www.postgresql.org/docs/9.5/static/sql-createview.html You can get the effect of an updatable view by creating INSTEAD OF triggers on the view, which must convert attempted inserts, etc. on the view into appropriate actions on other tables. For more information see CREATE TRIGGER. Another possibility is to create rules (see CREATE RULE), but in practice triggers are easier to understand and use correctly.

кста, раньше с сиквенсами в рулях всегда были траблы. даже без усложнений в виде джойнов. неужто починили ? (т.е. сослаться на NEW.seq_fld было нельзя -- сколько ссылок -- столько навариваний сиквенса проистекало)

руле -- это что--то из бреда отцов--основателей. не взлетело.
...
Рейтинг: 0 / 0
30.05.2016, 15:49
    #39246312
max_lbnv
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в rules для view двух связанных таблиц добавить id внешнего ключа?
Спасибо, прочел черным по белому. Попробую поработать с триггерами...
...
Рейтинг: 0 / 0
31.05.2016, 08:32
    #39246675
PCContra
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в rules для view двух связанных таблиц добавить id внешнего ключа?
qwwqне взлетело.

краткая суть топика
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Как в rules для view двух связанных таблиц добавить id внешнего ключа? / 4 сообщений из 4, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]