2012-03-29 74 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是做什么或预防 - 我们不知道。