
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
29.05.2016, 18:12
|
|||
|---|---|---|---|
|
|||
Как в rules для view двух связанных таблиц добавить id внешнего ключа? |
|||
|
#18+
Здравствуйте, уважаемые проектировщики! Только начинаю работать с 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 для связанных таблиц или где хотя-бы про это почитать? Как действовать в этом конкретном случае? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.05.2016, 11:05
|
|||
|---|---|---|---|
Как в rules для view двух связанных таблиц добавить id внешнего ключа? |
|||
|
#18+
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 было нельзя -- сколько ссылок -- столько навариваний сиквенса проистекало) руле -- это что--то из бреда отцов--основателей. не взлетело. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
30.05.2016, 15:49
|
|||
|---|---|---|---|
|
|||
Как в rules для view двух связанных таблиц добавить id внешнего ключа? |
|||
|
#18+
Спасибо, прочел черным по белому. Попробую поработать с триггерами... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=53&mobile=1&tid=1997204]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
148ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 452ms |

| 0 / 0 |
