Postgres: сложный вопрос CASCADE - убедитесь, что вы удаляете только ссылки на уникальные внешние ключи? - PullRequest
0 голосов
/ 20 сентября 2010

У меня есть несколько связанных таблиц в базе данных Postgres следующим образом:

    Table "public.key"
 Column | Type | Modifiers 
--------+------+-----------
 id     | text | not null
 name   | text | 
Referenced by:
    TABLE "enumeration_value" CONSTRAINT "enumeration_value_key_id_fkey" FOREIGN KEY (key_id) REFERENCES key(id)

Table "public.enumeration_value"
 Column | Type | Modifiers 
--------+------+-----------
 id     | text | not null
 key_id | text | 
Foreign-key constraints:
    "enumeration_value_key_id_fkey" FOREIGN KEY (key_id) REFERENCES key(id)
Referenced by:
    TABLE "classification_item" CONSTRAINT "classification_item_value_id_fkey" FOREIGN KEY (value_id) REFERENCES enumeration_value(id)

Table "public.classification_item"
     Column     | Type | Modifiers 
----------------+------+-----------
 id             | text | not null
 transaction_id | text | 
 value_id       | text | 
Foreign-key constraints:
    "classification_item_transaction_id_fkey" FOREIGN KEY (transaction_id) REFERENCES transaction(id)
    "classification_item_value_id_fkey" FOREIGN KEY (value_id) REFERENCES enumeration_value(id)

Я хочу

  • удалить все classification_items, связанные с определенным transaction
  • удалить все enumeration_values, связанные с этими classification_items
  • и, наконец, удалить все key элементы, связанные с этими enumeration_values.

Трудность заключается в том, что элементы key НЕ являются уникальными для enumeration_values, связанного (через classification_item) с определенным transaction.Они создаются независимо и могут существовать в нескольких транзакциях.

Таким образом, я знаю, как выполнить вторые два из этих шагов, но не первый:

delete from key where id in (select key_id from enumeration_value where id in (select value_id from "classification_item" where id = (select id from "transaction" where slice_id = (select id from slice where name = 'barnet')))); 
# In statement above: help! How do I make sure these keys are ONLY used with these values?
delete from enumeration_value where id in (select value_id from "classification_item" where id = (select id from "transaction" where slice_id = (select id from slice where name = 'barnet')));
delete from classification_item where transaction_id in (select id from "transaction" where slice_id = (select id from slice where name = 'barnet'));

Если бы только у postgres был оператор CASCADE DELETE ....

1 Ответ

1 голос
/ 20 сентября 2010

Если бы только у postgres был CASCADE DELETE заявление ....

PostgreSQL давно имеет эту опцию, начиная с версии 8.0 (5 лет назад). Просто используйте их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...