【发布时间】: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