12

データベースに2つのTIMESTAMP列を作成しようとしたときに、問題が発生しました。1つはと呼ばれcreated、もう1つはと呼ばれupdatedます。列の両方のデフォルト値CURRENT_TIMESTAMPを設定するのは簡単だと思いました。しかし、何らかの理由でMySQLはそれが悪い考えであることを意味します...それで、私は挿入クエリでそれらの1つを設定する必要なしにこれを行う方法を探していました。ON UPDATE CURRENT_TIMESTAMPupdated

この回答でトリガーを使用して1つの方法を見つけましたが、エラーが発生し続けます。実際にトリガーを作成できましたが、新しい行を挿入しようとするとエラーが発生します。

1442-このストアド関数/トリガーを呼び出したステートメントによって既に使用されているため、ストアド関数/トリガーのテーブル'タスク'を更新できません。

そして、それが何を意味するのかまったくわかりません。だから、私はここの誰かがこの主題に光を当てることができることを望んでいました。

テーブルとトリガーの作成に使用したSQLは次のとおりです。

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;

私はここで何が間違っているのですか?

4

1 に答える 1

28

トリガーは「挿入前」である必要があり、SET代わりに使用する必要がありますUPDATE

CREATE TRIGGER task_creation_timestamp BEFORE INSERT ON tasks 
FOR EACH ROW
SET NEW.created = NOW();
于 2010-05-25T17:54:08.540 に答える