0

dbにデータを挿入するときは、現在のレコードを前のレコードと比較する必要があります。必要に応じて、現在のレコードの一部の値を変更する必要があります。

以下のようなSQLをいくつか試しましたが、すべてSQLエラーが発生します。これは、複数のレコードを選択したというエラーが表示されます。

DELIMITER $$
 CREATE 
    TRIGGER set_moment_display
     BEFORE INSERT ON data
     FOR EACH ROW

     BEGIN
       DECLARE moment DATETIME;

       SELECT press_moment_1 INTO moment FROM data LIMIT 1;

       IF moment > NEW.press_moment_1 THEN SET NEW.press_moment_1 = moment;
       END IF;
     END$$
DELIMITER ;

上記で説明したことをどのように達成しますか。

4

2 に答える 2

0

エイリアス「OLD」を使用できます。

You can refer to columns in the subject table 
(the table associated with the trigger) by using the aliases OLD and NEW. 
OLD.col_name refers to a column of an existing row before 
it is updated or deleted. NEW.col_name refers to the column 
of a new row to be inserted or an existing row after it is updated

アップデート

ジム・ギャリソンは私に間違いを正しく指摘しました。「BEFOREINSERT」には「OLD」がありません。値の場合、このエイリアスはUPDATEおよびDELETEに対してのみ機能します。

于 2012-09-12T05:18:10.143 に答える
0

ここでの問題は、SQL データベースには暗黙的な行順序の概念がないため (すべてのクエリで順序基準を指定する)、トリガーが参照する「前の」行がないことです。「以前に挿入された行」は、挿入トリガーのコンテキストでは意味がありません。

少しの間、テーブルに行を挿入するプロセスがいくつかあったとします。プロセス #1 の挿入に対してトリガーが発生したとき、「前の」行はどの行ですか? プロセス#1によって以前に挿入されたもの?時系列的に「最新」の行がプロセス #3 によって実際に挿入されたとします。

これを行う必要がある場合、既知のキー値を使用して「最新」と理解している行を識別できない限り、トリガーで行うことはできません。それ以外の場合は、挿入を行っているアプリケーションで処理する必要があります。

于 2012-09-12T05:26:19.127 に答える