字段作为视图结果

时间:2016-10-05 18:04:57

标签: mysql

是否可以“自动”将列的值设置为查询结果?

例如,我希望有一个列,例如平衡,当我提出请求时,它应该返回一些交易的运行总数,但我更喜欢,如果这是预先计算的。

我可以以某种方式将列“链接”到视图或函数的结果吗?

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)

1 个答案:

答案 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列实际上是一个读取事务表的表达式。但这不会被预先计算出来。每次查询视图时,它都会重新查询事务,这可能是一种昂贵的解决方案。