2012-03-29 81 views
2

ON DELETE CASCADE在後續表上觸發DEL ON觸發器嗎?將Postgres打開DELETE CASCADE在後續表上觸發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

我認爲這是一個重大的錯誤,如果觸發器沒有被解僱 – 2012-03-29 19:09:58

+0

我想我明白髮生了什麼事情。我的觸發器需要一個OLD.m_value_id,它存在於m_int表中,但不在restults表上。當刪除發送到結果時,級聯刪除將不會有OLD.m_value_id,因此觸發器將不起作用。它可能是射擊,但我沒有得到任何結果。我將嘗試着解決如何以另一種方式最佳地減少我的rowcount表。 – 2012-03-29 19:13:48

+0

a_horse_with_no_name,有趣的是,今天我閱讀了關於MySQL的以下內容:「即使是由SQL語句引起的級聯更新和刪除,也不會激活MySQL觸發器(這違背了標準)」 – strkol 2012-03-29 20:35:21

回答

2

的手冊CREATE TABLE會告訴你:

此外,當被引用列的數據發生變化時,某些操作此表中的列對數據執行。 ON DELETE子句指定要刪除被引用表中的引用行時要執行的操作。 [...]

所以是的,刪除results也會刪除m_int。 當然這並不意味着,刪除m_int確實刪除了results中的任何內容。 而你的額外觸發器add_rows_m_intrem_rows_m_int是做什麼或預防 - 我們不知道。