Будет ли Postgres ON DELETE CASCADE запускать триггеры ON DELETE в последующих таблицах? - PullRequest
2 голосов
/ 29 марта 2012

Будет ли ON DELETE CASCADE запускать триггеры ON DELETE в последующих таблицах?

У меня есть три таблицы: результаты, m_int и количество строк. M_int связан с результатами с FK. Результаты имеют ON DELETE CASCADE и m_int имеет триггер для BEFORE DELETE. Rowcount отслеживает, сколько строк используется в m_int и каким пользователем.

Моя проблема в том, что когда я удаляю строку из результатов, я хочу, чтобы DELETE CASCADE запустил триггер на m_int. Есть идеи? Я потратил все утро на чтение документации и не могу найти ответ.

peri=> \d results
                          Table "public.results"
  Column   |  Type   |                      Modifiers                      
-----------+---------+-----------------------------------------------------
 result_id | integer | not null default nextval('result_id_seq'::regclass)
 trial__id | integer | not null
 title     | text    | 
Indexes:
    "results_pkey" PRIMARY KEY, btree (result_id)
Referenced by:
    TABLE "m_int" CONSTRAINT "m_int_result__id_fkey" FOREIGN KEY (result__id) REFERENCES results(result_id) ON DELETE CASCADE

peri=> \d m_int
                               Table "public.m_int"
   Column   |  Type   |                         Modifiers                          
------------+---------+------------------------------------------------------------
 metric__id | integer | not null
 result__id | integer | not null
 value      | integer | not null
 m_value_id | bigint  | not null default nextval('m_int_m_value_id_seq'::regclass)
Indexes:
    "m_int_pkey" PRIMARY KEY, btree (m_value_id)
Foreign-key constraints:
    "m_int_metric__id_fkey" FOREIGN KEY (metric__id) REFERENCES metrics(metric_id) ON DELETE CASCADE
    "m_int_result__id_fkey" FOREIGN KEY (result__id) REFERENCES results(result_id) ON DELETE CASCADE
Triggers:
    addrows_m_int AFTER INSERT ON m_int FOR EACH ROW EXECUTE PROCEDURE add_rows_m_int()
    remrows_m_int BEFORE DELETE ON m_int FOR EACH ROW EXECUTE PROCEDURE rem_rows_m_int()

peri=> \d rowcount
     Table "public.rowcount"
   Column   |  Type   | Modifiers 
------------+---------+-----------
 user__id   | integer | not null
 table_name | text    | not null
 total_rows | bigint  | 
Indexes:
    "rowcount_pkey" PRIMARY KEY, btree (user__id, table_name)

1 Ответ

2 голосов
/ 29 марта 2012

Руководство по CREATE TABLE скажет вам:

Кроме того, при изменении данных в столбцах, на которые сделаны ссылки, определенные действия выполняются с данными в этой таблицеколонны.Предложение ON DELETE указывает действие, которое нужно выполнить, когда удаляется ссылочная строка в ссылочной таблице.[...]

Так что да, удаление в results также удалит в m_int.Конечно, это не означает, что удаление в m_int действительно удаляет что-либо в results.И что ваши дополнительные триггеры add_rows_m_int и rem_rows_m_int делают или предотвращают - мы не знаем.

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