33

これが私がやろうとしていることです:

INSERTテーブルに新しいものがある場合、特定の(古い)アカウントが編集されたことを示すように設定して、 where =ACCOUNTSの行を更新する必要があります。ACCOUNTSpkNEW.edit_onstatus='E'

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
4

6 に答える 6

32

トリガーでこれをすべて行うことはできないようです。ドキュメントによると:

ストアド関数またはトリガー内で、関数またはトリガーを呼び出したステートメントによって(読み取りまたは書き込みのために)すでに使用されているテーブルを変更することは許可されていません。

この回答によると、次のようにする必要があります。

ストアドプロシージャを作成します。このストアドプロシージャは、ターゲットテーブルに挿入/更新してから、他の行をすべてトランザクションで更新します。

ストアドプロシージャを使用して、変更を手動でコミットします(挿入と更新)。私はMySQLでこれを行っていませんが、この投稿は良い例のように見えます。

于 2012-10-14T00:04:57.557 に答える
14

これは、挿入時に同じテーブルの行を更新する方法です

activationCodeおよびemailはテーブルの行USERです。挿入時に、の値を指定しませんactivationCode。MySQLによってその場で作成されます。

usernameMySQLユーザー名とデータベース名で変更しますdb_name

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
于 2015-04-10T10:32:14.050 に答える
5

同じ問題がありましたが、入力しようとしているIDで列を更新する必要があったため、更新を行うには、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 ;
于 2013-06-18T03:15:17.747 に答える
1

最後のエントリで; これは別のトリックです:

SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_schema = ... and table_name = ...
于 2016-03-28T10:28:29.067 に答える
0

代わりに、挿入前に使用して特定のテーブルのmax pkidを取得してから、maximiumpkidテーブルレコードを更新できます。

于 2018-07-13T10:58:08.083 に答える
0
DELIMITER $$

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

    SET NEW.STATUS = 'E';

END$$

DELIMITER ;
于 2019-08-01T11:10:39.577 に答える