web-dev-qa-db-ja.com

mysqlはフィールドのデフォルト値を他の列に設定します

Mysqlでフィールドのデフォルト値を他の列に設定する方法仮想フィールドでOracleを実行しましたが、Mysqlでこれを行う方法がわかりません。これは私のテーブルです。

create table TSM_TRANSACTION_TBL
(
  TRANS_ID     INT primary key auto_increment,
  LOCATION_ID  INT,
  TRANS_DATE   DATE,
  RESOURCE_ID  INT,
  TS_ID        INT,
  MAX_VALUE    INT,
  BOOKED_UNITS INT default 0,
  REMAINING    INT default MAX_VALUE - BOOKED_UNITS,
  BOOKED       INT not null,
  USER_ID      INT,
  TRANS_TIME   TIMESTAMP
)
25
BMW

データタイプのデフォルト値 に記載されているとおり:

データ型仕様の_DEFAULT value_句は、列のデフォルト値を示します。 1つの例外を除いて、デフォルト値は定数でなければなりません。関数または式にすることはできません。これは、たとえば、日付列のデフォルトを NOW() などの関数の値に設定できないことを意味します。または _CURRENT_DATE_ 。例外は、 _CURRENT_TIMESTAMP_TIMESTAMPのデフォルトとして指定できることです。 列。 11.3.5項「TIMESTAMPの自動初期化と更新」 を参照してください。

代わりに、挿入トリガーを定義できます。

_CREATE TRIGGER foo BEFORE INSERT ON TSM_TRANSACTION_TBL FOR EACH ROW
  IF NEW.REMAINING IS NULL THEN
    SET NEW.REMAINING := NEW.MAX_VALUE - NEW.BOOKED_UNITS;
  END IF;;
_
25
eggyal

「NEW」は、AFTER挿入トリガーには受け入れられません。 BEFORE挿入トリガーによって「フィールド更新」を行う必要があります。そう、

CREATE TRIGGER foo BEFORE INSERT ON TSM_TRANSACTION_TBL FOR EACH ROW
    IF NEW.REMAINING IS NULL THEN
        SET NEW.REMAINING := NEW.MAX_VALUE - NEW.BOOKED_UNITS;
    END IF;;
16
Darkside