web-dev-qa-db-fra.com

mysql définit la valeur par défaut du champ dans une autre colonne

Comment définir la valeur par défaut pour un champ à une autre colonne dans Mysql Je l'ai fait Oracle avec un champ virtuel mais je ne sais pas comment le faire dans Mysql voici ma table:

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

Comme indiqué sous Valeurs par défaut du type de données :

La clause DEFAULT value Dans une spécification de type de données indique une valeur par défaut pour une colonne. À une exception près, la valeur par défaut doit être une constante; ce ne peut pas être une fonction ou une expression. Cela signifie, par exemple, que vous ne pouvez pas définir la valeur par défaut pour une colonne de date comme étant la valeur d'une fonction telle que NOW() ou CURRENT_DATE . L'exception est que vous pouvez spécifier CURRENT_TIMESTAMP comme valeur par défaut pour une colonne TIMESTAMP . Voir Section 11.3.5, "Initialisation et mise à jour automatiques pour TIMESTAMP" .

Au lieu de cela, vous pouvez définir un déclencheur d'insertion:

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

Le "NOUVEAU" est inacceptable pour les déclencheurs APRÈS insertion. Vous devez faire la "mise à jour sur le terrain" par un déclencheur AVANT l'insertion. Donc,

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