【问题标题】:Trigger to copy a value from a table to another one触发器将一个值从一个表复制到另一个表
【发布时间】:2024-04-29 04:50:02
【问题描述】:

我有一张名为“moneyincome”的表

代码整数自增 金钱双倍 收入日期日期

然后我还有另一个叫“availablecash”

代码整数 金钱双倍

我的问题是:当我在表“moneyincome”中插入一个值时,我需要复制该值并“覆盖”或“替换”availablecash 中的值(到字段“money”中)作为该表中的唯一值但是除了将新值“添加”到availablcash表中的现有值之外...... 我认为触发器会很好 - 我一直在整个网络上寻找这些信息,但我无法得到我需要的信息。

我有一个名为 MoneyIncome 的表,它将通过从 java 界面添加一些数据来填充......一个 java 桌面应用程序。

用户将输入多少钱,然后他必须保存该操作。

我想要的是:当他保存该操作时,“触发器”会将这个值复制到另一个名为“availablemoney”的表中。

这个表(availableMoney)它没有任何链接。这是一个免费表,也没有 autoinc 键,因为我只想要一个值。最后一个值将是用户在表中添加的值 moneyincome 替换那里的旧值。

【问题讨论】:

标签: sqlite triggers


【解决方案1】:

将值从一个表复制到另一个表与规范化相反,因为您已经可以通过原始表轻松获得该值。

但是,您可能有多个moneyincome 行,并且您希望availablecash 反映可用的总金额。

例如 在 moneyincome 表中,您可能有以下内容:-

  • 1 40.00 2018-01-01
  • 2 50.00 2018-01-02
  • 3 25.00 2018-01-03

并且想要余额 aka availablecash 是 115.00。

您不需要另一个表,您可以通过查询来确定这一点(无论如何,您都必须查询另一个表才能获得商店余额)例如

SELECT sum(money) AS availablecash FROM moneyincome;

但是,如果你想要一个 TRIGGER;考虑到您的要求似乎是矛盾的,(您想用该表中的唯一值替换),以下将创建一个 TRIGGER,当有新行时,它将在 availablecash 表中插入一个新条目被插入到 moneyincome 表中:-

CREATE TRIGGER IF NOT EXISTS myavailablecashtrigger 
AFTER INSERT ON moneyincome 
BEGIN
    INSERT INTO availablecash VALUES(new.code,new.money);
END;
  • myavailablecashtrigger 是触发器的名称

基于以上 3 行插入 moneyincome 表的结果将是 availablecash 表将是:-

  • 注意!我意识到这可能不是您想要解释的,但我无法真正理解您想要什么。也许您应该展示您想要提供的示例(之前和之后)。我也相信你的设计/结构很可能不适合你想要的。

附加

根据您更新的要求,您实际上需要两个触发器(除非您最初在 availablecash 表中创建了第一行)。如果不存在则插入新行,然后插入正常的行来更新行。

这里有两个触发器:-

-- Normal Trigger (when row already exists in the availablecash table)
CREATE TRIGGER IF NOT EXISTS myavailablecashtrigger 
AFTER INSERT ON moneyincome WHEN (SELECT count() FROM availablecash)
BEGIN
    --UPDATE availablecash SET money = new.money;
    UPDATE availablecash SET money = new.money, code = new.code;
END;

-- Trigger for when availablecash table is empty
CREATE TRIGGER IF NOT EXISTS myavailablecashtrigger_nodata
AFTER INSERT ON moneyincome WHEN (SELECT count() FROM availablecash) = 0
BEGIN
    INSERT INTO availablecash VALUES(new.code,new.money);
END;

【讨论】:

    【解决方案2】:

    我一直在研究你的例子(我很感激),我找到了一个可能的解决方案:

    让我们记住。我有 2 个表“MoneyIncome”和“AvailableCash”,这段代码有效,但只是当我插入一个新值时。如果我在表 MoneyIncome 中编辑一个值,它将不起作用。当我尝试编辑 MoneyIncome 中的任何值并且它在我的另一个表中没有发生任何事情时。正如您在这个可能的解决方案中看到的那样,这里是“求和并覆盖”我的表 AvailableCash 中的旧值。但在编辑模式下它不起作用。

    这是我的 2 个结构表

    金钱收入 代码:整数:PK:Autoinc 金钱:双倍


    可用现金

    代码:PK 不是 Autoinc 可用货币:双倍

    CREATE TRIGGER update_value
    AFTER INSERT
    ON MoneyIncome
          WHEN (
    SELECT count() 
      FROM AvailableCash
    
    
    BEGIN
    UPDATE AvailableCash
       SET availablemoney = (new.money + availablemoney),
           code = new.code;
    END;
    

    我不知道在编辑模式下我该怎么做。

    【讨论】: