是否可以“自动”将列的值设置为查询结果?
例如,我希望有一个列,例如平衡,当我提出请求时,它应该返回一些交易的运行总数,但我更喜欢,如果这是预先计算的。
我可以以某种方式将列“链接”到视图或函数的结果吗?
PS。我们使用MySQL Cluster
查询如下所示:
SET @id = 'customerid';
SET @accId = 'accid';
Select sum(trans.t) - sum(trans.c) as Balance
from ( select *,
case when ACNO2=@accId then a1 * 1 else a1 * -1 end as t,
case when (TrCode= '40' and ACNO2=@accId) then 0 else ChargeAmount1 end as c
from OldTransactions
where (((CLNO1=@id and CLNO2=@id) or (CLNO1=@id or CLNO2=@id)) and TStatus='OK')) as trans
where (ACNO1=@accId or ACNO2=@accId)
答案 0 :(得分:1)
http://dev.mysql.com/doc/refman/5.7/en/create-table.html部分说:
DEFAULT子句指定列的默认值。有一个 异常,默认值必须是常量;它不可能是一个 功能或表达。这意味着,例如,你不能 将日期列的默认值设置为函数的值 如NOW()或CURRENT_DATE。例外情况是您可以指定 CURRENT_TIMESTAMP是TIMESTAMP或DATETIME列的默认值。
(强调我的)
因此,您无法使用DEFAULT
语法将列定义为子查询的结果。
作为替代方案,您可以在要监控的交易表上create triggers,以便对交易的任何更改都会更新您的余额列。
您应该为每个操作创建一个触发器:插入,删除和更新。
CREATE TRIGGER trx_ins_balance ON transactions AFTER INSERT
FOR EACH ROW
UPDATE accounts SET accounts.balance = accounts.balance + NEW.amount
WHERE accounts.accountid = NEW.accountid;
CREATE TRIGGER trx_del_balance ON transactions AFTER DELETE
FOR EACH ROW
UPDATE accounts SET accounts.balance = accounts.balance - OLD.amount
WHERE accounts.accountid = NEW.accountid;
CREATE TRIGGER trx_upd_balance ON transactions AFTER UPDATE
FOR EACH ROW
UPDATE accounts SET accounts.balance = accounts.balance - OLD.amount + NEW.amount
WHERE accounts.accountid = NEW.accountid;
以上只是一个例子。不要问我一个更具针对性的例子,因为你不应该从Stack Overflow中逐字使用代码。如果您要使用它们,您应该了解如何编写自己的触发器。
另一个解决方案是create a VIEW,以便您的balance列实际上是一个读取事务表的表达式。但这不会被预先计算出来。每次查询视图时,它都会重新查询事务,这可能是一种昂贵的解决方案。