簡體   English   中英

MySQL - 插入后更新同一個表的觸發器

[英]MySQL - Trigger for updating same table after insert

這是我想要做的:

當表ACCOUNTS有新的INSERT ,我需要通過設置status='E'來更新ACCOUNTSpk = NEW.edit_on的行,以表示特定(舊)帳戶已被編輯。

DELIMITER $$

DROP TRIGGER IF EXISTS `setEditStatus`$$
CREATE TRIGGER `setEditStatus` AFTER INSERT on ACCOUNTS
FOR EACH ROW BEGIN
    update ACCOUNTS set status='E' where ACCOUNTS.pk = NEW.edit_on ;
END$$

DELIMITER ;

要求不是我操作新插入的列,而是已經存在的pk = NEW.edit_on

但是,我無法更新同一張表: Can't update table ACCOUNTS ... already used by the statement that invoked this trigger

請提出解決方法

PS:我已經經歷過在同一個表上更新后在觸發器中更新表插入同一個表觸發器mysql在同一個表上插入觸發器后更新和在表上插入后插入和更新mysql觸發器,但他們似乎沒有回答我的問題。

編輯

ACCOUNTS表:

CREATE TABLE  `ACCOUNTS` (
  `pk` bigint(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` bigint(9) unsigned NOT NULL,
  `edit_on` bigint(10) unsigned DEFAULT NULL,
  `status` varchar(1) NOT NULL DEFAULT 'A',
  PRIMARY KEY (`pk`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=2147483726 DEFAULT CHARSET=latin1

似乎您無法在觸發器中完成所有這些。 根據文檔

在存儲的函數或觸發器中,不允許修改已被調用函數或觸發器的語句使用(用於讀取或寫入)的表。

根據這個答案,您似乎應該:

創建一個存儲過程,插入/更新目標表,然后更新其他行,所有這些都在一個事務中。

使用存儲過程,您將手動提交更改(插入和更新)。 我還沒有在 MySQL 中這樣做過,但這篇文章看起來是一個很好的例子。

這就是我如何在插入時更新同一個表中的一行

activationCodeemail是表USER中的行。 在插入時,我沒有為activationCode指定值,它將由 MySQL 動態創建。

用你的 MySQL 用戶名和db_name用你的數據庫名稱更改username名。

CREATE DEFINER=`username`@`localhost` 
       TRIGGER `db_name`.`user_BEFORE_INSERT` 
       BEFORE INSERT ON `user` 
       FOR EACH ROW
         BEGIN
            SET new.activationCode = MD5(new.email);
         END

有同樣的問題,但必須用即將進入的 id 更新一列,所以你可以做一個更新,應該在 BEFORE 和 AFTER 之前沒有 BEFORE 沒有 id 所以我做了這個技巧

DELIMITER $$
DROP TRIGGER IF EXISTS `codigo_video`$$
CREATE TRIGGER `codigo_video` BEFORE INSERT ON `videos` 
FOR EACH ROW BEGIN
    DECLARE ultimo_id, proximo_id INT(11);
    SELECT id INTO ultimo_id FROM videos ORDER BY id DESC LIMIT 1;
    SET proximo_id = ultimo_id+1;
    SET NEW.cassette = CONCAT(NEW.cassette, LPAD(proximo_id, 5, '0'));
END$$
DELIMITER ;

在最后一個條目上; 這是另一個技巧:

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = ... and table_name = ...

相反,您可以在插入之前使用並獲取特定表的最大 pkid,然后更新最大 pkid 表記錄。

DELIMITER $$

DROP TRIGGER IF EXISTS `setEditStatus`$$
CREATE TRIGGER `setEditStatus` **BEFORE** INSERT on ACCOUNTS
FOR EACH ROW BEGIN

    SET NEW.STATUS = 'E';

END$$

DELIMITER ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM