【问题标题】:MySQL trigger keeps adding two rows for every updateMySQL触发器为每次更新添加两行
【发布时间】:2015-07-20 21:08:27
【问题描述】:

我正在尝试在每次更新“tickets”表后更新“ticketHistory”表。我设置了以下触发器,以便在我的“票证”表更新时运行(通常是在编辑字段时):

 TRIGGER `ticket_edit` AFTER UPDATE ON `tickets` FOR EACH ROW INSERT INTO ticketHistory
    (ticketId, action, originator, assigned, date)
VALUES 
    (NEW.ticketId, "Edited", NEW.userId, NEW.assigned, NEW.lastUpdated);

每当在我的应用程序中完成更新时,正在编辑的字段以及“lastUpdated”时间都会更新。我认为因为正在更新两个字段,所以它运行了两次触发器,导致两个相同的行被插入到我的“ticketHistory”表中。我只想插入一行。

有没有办法将其限制为仅插入一行?任何帮助是极大的赞赏!

编辑

所有数据库插入和更新都使用 CodeIgniter 的 ActiveRecord 完成。

我的模特:

public function editTicket($ticket)
{
    $q = $this->db->where('ticketId', $ticket['ticketId']);
    $q = $this->db->update('tickets', $ticket);

    $results = $this->db->affected_rows();
}

我的控制器:

public function edit_ticket()
{
    $ticketId = $this->uri->segment(3);
    $description = str_replace("\n", "\r", $this->input->post('description'));

    $ticket = array(
        'ticketId'    => $ticketId,
        'headline'    => $this->input->post('headline'),
        'description' => $description,
        'priority'    => $this->input->post('priority'),
        'category'   => $this->input->post('category'),
        'lastUpdated' => date("Y-m-d H:i:s", time())
    );

    $this->tickets->editTicket($ticket);
}

【问题讨论】:

  • 在您的代码中未显示,当您更新tickets 时,请在一个语句中而不是两个语句中执行此操作。这应该可以在ticketHistory 中解决问题。
  • 好吧,为了让事情更混乱,我在更新“票证”时使用 CodeIgniters ActiveRecord 进行更新。这是在两个语句中做的吗?
  • 哈哈!我知道,但我别无选择
  • 你能把codeigniter AR的代码贴出来吗,也许其中一位大师可以看到明显的
  • 编辑 OP 以显示 CodeIgniter 代码

标签: php mysql codeigniter activerecord triggers


【解决方案1】:
public function editTicket($ticket)
{
    $q = $this->db->where('ticketId', $ticket['ticketId']);
    echo "I am here again<br/>";
    $q = $this->db->update('tickets', $ticket);

    $results = $this->db->affected_rows();
}

【讨论】:

  • 我发布了一个解决方案,导致它只添加一行,但感谢您的帮助!
  • 只要确保你没有一些外包装,并且你认为你只调用了一次。显然我无法通过它祝你好运!
  • tickets.ticketId 是您明确设置的,tickets.lastUpdated 不是是您明确设置的 (???)。如果 AR 为您设置时间戳的地方是正确的,那么这一定是人们面临的常见触发问题。
  • 其实我并不是想把那部分复制粘贴过来。我只是在测试它,看看它是否有所作为。我使用的解决方案已被编辑以纠正该问题。谢谢你的收获!
  • 我想知道的是第二个更新语句(到 lastUpdated)是如何发生的。是否由 CI AR 自动完成。
【解决方案2】:

我不确定为什么要添加 2 个不同的行,但您可以只创建一个主键字段,而您的 DBMS 不允许重复。

希望这会有所帮助!

【讨论】:

  • 我认为你误读了他问题的第一句话或第二句话
【解决方案3】:

因此,作为一种解决方案,我修改了我的触发器:

TRIGGER `ticket_edit` AFTER UPDATE ON `tickets`
FOR EACH ROW 
IF NEW.headline <> OLD.headline || NEW.description <> OLD.description || NEW.priority <> OLD.priority
THEN
    INSERT INTO ticketHistory
        (ticketId, action, originator, assigned, date)
    VALUES 
        (NEW.ticketId, "Edited", NEW.userId, NEW.assigned, NEW.lastUpdated);
END IF

通过添加条件,我认为它只激活了一次触发器,导致只插入一行。

希望这对某人有所帮助!

【讨论】:

    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-23
    • 2015-01-17
    • 1970-01-01
    • 2017-11-13
    相关资源
    最近更新 更多