MySQL触发器为每次更新

时间:2015-07-20 21:08:27

标签: php mysql codeigniter activerecord triggers

我正在尝试更新一个' ticketHistory'每次更新我的门票后的表格#39;表。我有以下触发器设置,以便在我的“门票”时运行。表已更新(通常在编辑字段时):

 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);

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

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

修改

所有数据库插入和更新都是使用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);
}

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分:0)

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

希望这有帮助!

答案 2 :(得分:0)

所以,作为解决方案,我修改了我的触发器:

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

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

希望这有助于某人!