MariaDB / MySQL -根据前面行中的值生成存储列

yxyvkwin  于 2023-04-28  发布在  Mysql
关注(0)|答案(2)|浏览(96)

由于冗长而无聊的原因†我需要添加一个生成的列(running_total)到一个非常简单的数据库中,该数据库包含一个表(solar_generation),该表将当前行中的一个列(amount)和前19行相加。总共20行。

ALTER TABLE solar_generation ADD running_total INT GENERATED ALWAYS AS (select sum(amount) from solar_generation order by solar_generation.id asc limit 20) STORED;

但是,它并不喜欢它--它告诉我不能在生成语句中使用select。所以...有什么好主意吗
†我试图在我的家庭助理 Jmeter 板上安装一个太阳能发电监视器,但不喜欢我给它的复杂选择查询,只想从一行中拉出一列。所以我想添加一个生成的列会让它高兴。以我的理智为代价,它会出现。

ie3xauqp

ie3xauqp1#

简单的答案是,您不能将计算作为需要来自其他行或其他表的数据的生成列来执行。生成的列只能在当前行内执行确定性计算。
如果要在数据库结构中包含此计算列,则需要创建视图。
mysql manual中记录了对生成列的限制:
允许使用文字、确定性内置函数和运算符。如果给定表中的相同数据,多次调用产生相同的结果,则函数是确定性的,与连接的用户无关。非确定性函数和未通过此定义的函数示例:CONNECTION_ID()、CURRENT_USER()、NOW()。
不允许存储函数和可加载函数。
不允许使用存储过程和函数参数。
不允许使用变量(系统变量、用户定义的变量和存储的程序局部变量)。
不允许子查询。
生成的列定义可以引用其他生成的列,但只能引用表定义中前面出现的那些列。生成的列定义可以引用表中的任何基(非生成的)列,无论其定义出现在之前还是之后。
AUTO_INCREMENT属性不能在生成的列定义中使用。
AUTO_INCREMENT列不能用作生成的列定义中的基列。
如果表达式计算导致截断或向函数提供不正确的输入,CREATE TABLE语句将终止并返回错误,DDL操作将被拒绝。

l5tcr1uw

l5tcr1uw2#

您不能按照Shadow描述的那样对生成的列执行此操作。
在插入期间计算列很少是最好的解决方案(使用视图/存储过程),但如果你真的想这样做,你可以使用触发器:

CREATE TRIGGER tr_solar_generation
BEFORE INSERT
ON solar_generation
FOR EACH ROW
BEGIN
  DECLARE v_sum INT;
  
  SELECT SUM(amount) INTO v_sum
  FROM solar_generation 
  ORDER BY solar_generation.id desc 
  LIMIT 19;
  
  SET new.running_total = ifnull(v_sum,0) + new.amount;
END

相关问题