1

行の更新時にフィールドを自動インクリメントするトリガーを実装しようとしています。PERSON テーブルの既存の行が更新されるたびに、consistency_version を自動的に 1 ずつ増やしたいと考えています。

私のテーブル:

CREATE TABLE PERSON (
id INT NOT NULL AUTO_INCREMENT,
consistency_version INT NOT NULL DEFAULT 0,
name    CHAR (100) NOT NULL,
);

およびトリガー:

CREATE TRIGGER consistency_version_trigger BEFORE UPDATE ON PERSON
FOR EACH ROW SET NEW.VERSION = @VERSION+1 

テーブルの行で更新ステートメントを実行すると、consistency_version が 1 ずつ増加することが期待されます

しかし、次のエラーが表示されます。

Column "consistency_version" cannot be null

誰かが私が間違っていることをアドバイスできますか? @VERSION は null だと思います。この値を更新中の現在の行のバージョンに設定するにはどうすればよいですか?

4

3 に答える 3

1

私の最善の推測は、「@version」が NULL を返しているということです。これにより、@version + 1 の結果が null になり、null 不可の Consistency_version 列を null に設定しようとすると、エラーが発生します。

代わりに OLD を使用してみましたか?

CREATE TRIGGER consistency_version_trigger BEFORE UPDATE ON PERSON
FOR EACH ROW SET NEW.VERSION = OLD.VERSION+1

于 2013-08-02T12:32:46.230 に答える
1

@VERSION はセッション変数です。それは存在し、それを作成したセッション中にのみ表示されます。つまり、基本的にSET NEW.VERSION = NULL + 1どれがNULLであるかを言っています。

組み込みの自動インクリメント機能が何らかの理由でニーズに合わないと仮定します。

グローバルな自動インクリメント値を作成するには、テーブルを使用する必要があります。次のようなテーブルを作成します。

CREATE TABLE `consistency_version` (
    `consistency_version` INT(10) UNSIGNED NOT NULL
) ENGINE=MyISAM;
INSERT INTO `consistency_version` VALUES(1);

そして、次のように次の番号を取得します。

UPDATE consistency_version SET consistency_version = LAST_INSERT_ID(consistency_version +1);
SET NEW.VERSION = LAST_INSERT_ID();

これは、次の番号を保持するための一時的な場所として LAST_INSERT_ID を使用します。詳細については、マニュアルを参照してください。

トランザクション中に長時間ロックされないように、シーケンス テーブルを MyISAM にすることも重要です。

于 2013-08-02T12:29:07.673 に答える