mysql将字段默认值设置为其他列

BMW*_*BMW 25 mysql default default-value

如何将字段的默认值设置为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
)
Run Code Online (Sandbox Code Playgroud)

egg*_*yal 25

数据类型默认值所述:

数据类型规范中的子句指示列的默认值.除了一个例外,默认值必须是常量; 它不能是一个功能或表达.这意味着,例如,您不能将日期列的默认值设置为函数的值,例如或.例外情况是您可以指定列的默认值.请参见第11.3.5节"自动初始化和更新".DEFAULT valueNOW()CURRENT_DATECURRENT_TIMESTAMPTIMESTAMPTIMESTAMP

相反,您可以定义插入触发器:

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;;
Run Code Online (Sandbox Code Playgroud)

  • 我使用了你的代码,但它告诉我,我不能在插入后使用new,并且我将它更改为之前并且它工作正常 (7认同)
  • 对于最近检查过的人,MySQL 现在允许使用 DEFAULT 子句的函数 https://dev.mysql.com/doc/refman/8.0/en/data-type-defaults.html (2认同)

小智 17

对于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;;
Run Code Online (Sandbox Code Playgroud)

  • 我修复@eggyal的答案 (2认同)

Joh*_*n C 9

MySQL 8.0.13开始,您可以引用另一列作为列的默认值。

一列的表达式默认值可以引用其他表列,但对生成的列或具有表达式默认值的列的引用必须是表定义中较早出现的列。也就是说,表达式默认值不能包含对生成的列或具有表达式默认值的列的前向引用。

CREATE TABLE table1 (
  id int NOT NULL AUTO_INCREMENT,
  name varchar(250) NOT NULL,
  name_url varchar(250) NOT NULL DEFAULT (`name`),

  created datetime NOT NULL DEFAULT (UTC_TIMESTAMP()),
  modified datetime NOT NULL DEFAULT (UTC_TIMESTAMP()),

  PRIMARY KEY (id),
)
ENGINE = INNODB,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_0900_ai_ci;
Run Code Online (Sandbox Code Playgroud)