【问题标题】:Will Postgres ON DELETE CASCADE fire ON DELETE triggers on subsequent tables?Postgres ON DELETE CASCADE 会在后续表上触发 ON DELETE 触发器吗?
【发布时间】:2012-03-30 03:07:32
【问题描述】:

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)

【问题讨论】:

  • 如果触发器没有被触发,我会认为这是一个重大错误
  • 我想我明白发生了什么。我的触发器需要一个 OLD.m_value_id,它存在于 m_int 表上,但不在 restults 表上。当删除发送到结果时,级联删除将没有 OLD.m_value_id,因此触发器将不起作用。它可能会触发,但我没有得到任何结果。我将尝试找出如何最好地以另一种方式减少我的行数表。
  • a_horse_with_no_name,有趣的是,今天我读到以下关于 MySQL 的内容:“即使是由 SQL 语句引起的级联更新和删除也不会激活 MySQL 触发器(这违反标准)”
  • @strkol:MySQL 有很多功能被破坏或从未完全实现。将 MySQL 作为关系 DBMS 应该如何工作的参考是一个坏主意。
  • 您应该向我们展示您的触发器定义,而不是显示表定义。我的猜测是你的触发器有错误。

标签: function postgresql triggers


【解决方案1】:

CREATE TABLE 的手册会告诉你:

此外,当引用列中的数据发生更改时,会对该表列中的数据执行某些操作。 ON DELETE 子句指定当被引用表中的被引用行被删除时要执行的操作。 [...]

所以是的,在results 中删除也会在m_int 中删除。 当然这并不意味着在m_int 中删除确实会删除results 中的任何内容。 以及您的额外触发器 add_rows_m_intrem_rows_m_int 做什么或阻止 - 我们不知道。

【讨论】:

    猜你喜欢
    • 2011-09-21
    • 2014-09-26
    • 2012-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-06-25
    相关资源
    最近更新 更多