Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

MySQL: How to create trigger for setting creation date for new rows

I ran into a problem as I tried to create two TIMESTAMP columns in my database. One called created and one called updated. I figured it would be easy to set the default value of both to CURRENT_TIMESTAMP and then ON UPDATE CURRENT_TIMESTAMP for the updated column. But for some reason MySQL means that's a bad idea... so I have been looking for ways to do this without having to set one of them in the insert query.

I found one way by using a trigger in this answer, but I keep getting errors. I just managed to actually create the trigger, but now I get errors when I try to insert new rows claiming that

1442 - Can't update table 'tasks' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

And I don't get what that means at all. So, I was hoping someone here could shed some light up this subject.

The SQL I used to create the table and the trigger is as follows:

CREATE TABLE `tasks` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `created` DATETIME,
  `updated` TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `title` VARCHAR(255) NOT NULL,
  `notes` TEXT,
  `status_id` INT(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status_id` (`status_id`),
  CONSTRAINT `fk_tasks_statuses` FOREIGN KEY (`status_id`) REFERENCES `statuses` (`id`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TRIGGER task_creation_timestamp AFTER INSERT ON tasks 
FOR EACH ROW
UPDATE tasks SET created = updated WHERE id = NEW.id;

What am I doing wrong here?

like image 418
Svish Avatar asked May 25 '10 17:05

Svish


People also ask

How do I create a trigger before insert in SQL?

Introduction to MySQL BEFORE INSERT triggers First, specify the name of the trigger that you want to create in the CREATE TRIGGER clause. Second, use BEFORE INSERT clause to specify the time to invoke the trigger. Third, specify the name of the table that the trigger is associated with after the ON keyword.

Can a new table have a trigger?

OLD TABLE and NEW TABLE can only be specified once each, and only for AFTER triggers or INSTEAD OF triggers. FOR EACH STATEMENT may not be specified for BEFORE triggers or INSTEAD OF triggers. A trigger event must not be specified more than once for the same operation.


1 Answers

Your trigger needs to be "before insert", and you need to use SET instead of UPDATE:

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW
SET NEW.created = NOW();
like image 168
Ike Walker Avatar answered Oct 05 '22 17:10

Ike Walker