2015-07-20 4 views
0

Я пытаюсь обновить таблицу «ticketHistory» после каждого обновления таблицы «билетов». Я следующий триггер настроен для запуска всякий раз, когда мой стол «БИЛЕТЫ» обновляется (обычно, когда поле редактируется):Триггер MySQL добавляет две строки для каждого обновления.

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». Мне нужна только одна строка.

Есть ли способ ограничить его только одним вставкой? Любая помощь очень ценится!

EDIT

Все вставки базы данных и обновления делается с помощью ActiveRecord CodeIgniter в.

Моя модель:

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); 
} 
+0

в вашем коде не показан, когда вы обновляете 'билеты', делайте это в одном утверждении не два. это должно прояснить ситуацию в 'ticketHistory'. – Drew

+0

Ну, чтобы сделать вещи более запутанными, я использую CodeIgniters ActiveRecord, чтобы сделать обновление, когда обновляю «билет». Это делается в двух утверждениях? – jldavis76

+0

Ха-ха! Я знаю, но у меня нет выбора – jldavis76

ответ

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 

Добавляя условными, я думаю, что он включается только на курок один раз, в результате чего только одна строка вставляется.

Надеюсь, это поможет кому-то!

0

Я не уверен, почему это добавление 2 разные строки, но вы могли бы просто сделать поле первичного ключа и СУБД Wouldn» t разрешить дубликат.

Надеюсь, это поможет!

+0

Я думаю, что вы неправильно читаете первое предложение или два его вопроса – Drew

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(); 
} 
+0

Я разместил решение, которое заставило его добавить только одну строку, но спасибо за помощь! – jldavis76

+0

просто убедитесь, что у вас нет внешней обертки, и вы думаете, что вызываете ее один раз. очевидно, я не могу пройти через это удачу! – Drew

+0

и ticket.ticketId явно заданы вами, а ticket.lastUpdated - это ** не **, явно заданный вами (???). Если это правильно, когда AR устанавливает временную метку для вас, это должно быть общей проблемой запуска, с которой сталкиваются люди. – Drew