我转向 postgresql 的原因之一是(与 mysql 不同)外键操作(例如级联删除)可以触发触发器。
在我的数据库中,我有表“penalty_kicks”,其中外键引用“player_instance”:
ALTER TABLE penalty_kicks ADD FOREIGN KEY (kicker_id) REFERENCES player_instance (id) ON DELETE CASCADE;
Run Code Online (Sandbox Code Playgroud)
我知道,当我删除一个player_instance时,惩罚_踢的每个关联行都会被删除。
我还有一个触发器函数,如果删除penalty_kicks 行,那么它将更改“scores”行:
CREATE TRIGGER delete_penalty_kicks AFTER DELETE ON penalty_kicks FOR EACH ROW EXECUTE PROCEDURE delete_kicks();
CREATE FUNCTION delete_kicks()
RETURNS trigger AS $temp$
BEGIN
UPDATE scores s
SET points = points -3
FROM player_instance pi
WHERE pi.id = OLD.kicker_id
AND s.match_id = pi.match_id
AND s.team_id = pi.team_id
AND OLD.success;
RETURN NULL;
END;
$temp$
LANGUAGE 'plpgsql';
Run Code Online (Sandbox Code Playgroud)
(非常感谢另一位用户的上述内容)
我知道这是有效的,因为当我删除penalty_kicks 的行时,它将在得分上执行正确的操作。
但是,当我删除player_instance时,它只会删除penalty_kick(通过级联),而不会触发触发器来改变分数。
有任何想法吗?
谢谢
我有一个名为“player_instance”的表,然后是一个名为“penalties”的表(它有一个引用 player_instance 的外键)。我还有一个叫做“分数”的表格。
我有一个关于惩罚的 DELETE TRIGGER,这样如果删除一行,它就会改变分数中的一列。我知道这是有效的 - 当一个惩罚被删除时,它会减少分数列。
我还有一个 ON DELETE CASCADE,如果 player_instance 被删除,那么所有相关的惩罚也将被删除。我知道这也有效。
但是当 player_instance 被删除时,它只会删除相关的惩罚,而不会触发改变分数的触发器。谁能帮助我理解为什么这不起作用?
非常感谢
我正在创建一个动态菜单,我可以在其中添加和删除新表单.
<input type="button" value="generate form" id="test"/>
<div id="form1"></div>
<script>
$(document).ready(function() {
$("#test").click(function() {
$("#form1").append("<select id='score-attempt'><option value='penalty'>penalty</option></select><input type='button' value='remove' id='remove'/><br>");
});
$("#form1 #remove").click(function() {
alert($(this).index());
});
});
Run Code Online (Sandbox Code Playgroud)
问题是单击删除永远不会触发警告框.
谢谢