LINUX.ORG.RU

Наследование в postresql не применимо для собственно наследования?

 , ,


0

2

Привет, лор. Нужен совет. Есть (будет) такая база

CREATE TABLE item (
  item_id SERIAL PRIMARY KEY,
  name VARCHAR(127) NOT NULL,
  manufacturer_id INT
);
CREATE TABLE matroska (
  count INT NOT NULL -- вложенность матрёшек, не применимо к другим товарам
) INHERITS (item);
CREATE TABLE "order" (
  order_id SERIAL PRIMARY KEY,
  customer_id INT
);
 CREATE TABLE order_items (
  order_id INT NOT NULL REFERENCES "order",
  item_id INT NOT NULL REFERENCES item
);
insert into matroska (name, manufacturer_id, count) values ('Маша', 9001, 9);
insert into "order" (customer_id) values (100500);

Очевидное содержимое таблиц очевидно:

=> select * from matroska ;
 item_id | name | manufacturer_id | count
---------+------+-----------------+-------
       1 | Маша |            9001 |     9
(1 строка)

=> select * from item;
 item_id | name | manufacturer_id
---------+------+-----------------
       1 | Маша |            9001
(1 строка)

=> select * from "order";
 order_id | customer_id
----------+-------------
        1 |      100500
(1 строка)
Теперь кладём товар в корзину покупателя и облом:
=> insert into order_items values (1,1);
ОШИБКА:  INSERT или UPDATE в таблице "order_items" нарушает ограничение внешнего ключа "order_items_item_id_fkey"
ПОДРОБНОСТИ:  Ключ (item_id)=(1) отсутствует в таблице "item".
Я понимаю, почему тут эта ошибка (foreign key не смотрит в дочерние таблицы, а insert, сделанный в дочернюю, не добавляет настоящих данных в родительскую). Я не понимаю, как делать правильно и нахрена этот INHERIT нужен (кроме костылей с партиционированием, которые дико популярны на стаковерфлоу).

★★★★★

Я не понимаю, как делать правильно и нахрена этот INHERIT нужен (кроме костылей с партиционированием, которые дико популярны на стаковерфлоу).

из доки постгреса: «A serious limitation of the inheritance feature is that indexes (including unique constraints) and foreign key constraints only apply to single tables, not to their inheritance children. This is true on both the referencing and referenced sides of a foreign key constraint». Т.е. «правильно» это не сделать никак, разве что рисовать костылищща с триггерами, изобретая велосипедный а-ля foreign key.

Нахрена нужен inherit - собственно, без внешних ключей почти все работает. Приятная иногда юзабельная плюшка.

arkhnchul ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.