Pominąłeś kolumnę danych z przykładu wstawiania, ale wspomniałeś o tym kilka razy, więc założę, że istnieje. Zakładam również, że jest to rzeczywista data (nie znacznik czasu ani data-godzina).
Jeśli dodasz unikalny indeks w dniu (użytkownik,działanie,data), Twoje zapytanie będzie działać.
Oto DDL:
alter table useractions
add unique index unique_idx (user,action,date);
I Twój DML (dodanie kolumny daty):
insert into useractions (user, action, times, date) values (2, 3, 1, current_date())
on duplicate key update times = times + 1;