【问题标题】:Mysql trigger to update if date match and insert if no match all BEFORE INSERT如果日期匹配,Mysql 触发器更新,如果不匹配,则在插入之前全部插入
【发布时间】:2018-05-24 07:18:18
【问题描述】:

我有一张桌子summary。我希望在插入此表之前触发 TRIGGER,即summary,我想要的是,TRIGGER 应该检查传入日期是否与现有日期匹配,它应该更新表并将传入值添加到现有值,否则它应该只需插入

`摘要` +------+--------+--------------+------+ |日期 |收入 |支出|其他| |22/17 | 200 | 50 | 30 | |22/17 | 100 | 10 | 80 | |23/17 | 50 | 100 | 0 | +------+--------+--------------+------+ `summary` // 这就是我想要的样子 +------+--------+--------------+------+ |日期 |收入 |支出|其他| |22/17 | 300 | 150 | 30 | |23/17 | 50 | 100 | 0 | +------+--------+--------------+------+

我的表代码

创建表`摘要`( `id_` int(11) NOT NULL, `date_` 日期不为空, `income_` 文本不为空, `expenditure_` 文本不为空, `other_` 文本不为空, 主键(id) ) 引擎=InnoDB 默认字符集=latin1; 插入“摘要” (`id_`、`date_`、`income_`、`expenditure_`、`other_`) 价值观 (1, '2017-12-22', 200, 50, 30), (2, '2017-12-22', 100, 10, 80), (3, '2017-12-23', 50, 100, 0);

这是我迄今为止一直在尝试的,虽然我是一名诺维主义者
触发代码

分隔符 $$ 创建触发器 inc_trig 插入前 关于收入_ 每一行 开始 申报收入、支出、其他 INT; SET收入=1; SET支出=2;设置其他=3; 如果(新日期_!=日期_)那么 IF NEW.name_ = 收入 THEN 插入摘要(日期_,收入) 值(new.date_,new.amount); ELSEIF NEW.name_ = 支出 THEN 插入摘要(日期_,支出_) 值(new.date_,new.amount); ELSEIF NEW.name_ = 其他 THEN 插入摘要(日期_,其他_) 值(new.date_,new.amount); ELSE(new.date_ = date_)THEN IF NEW.name_ = 收入_ THEN 更新摘要设置收入_ = 收入_ + new.amount); ELSEIF NEW.name_ = 支出 THEN 更新摘要设置支出_ = 支出_ + new.amount); ELSEIF NEW.name_ = 其他 THEN 更新摘要 SET other_ = other_ + new.amount); 万一; 结尾 $$

【问题讨论】:

    标签: mysql validation triggers insert


    【解决方案1】:

    有一个更简单的方法。首先,在 date 列上添加 unique 约束以防止重复条目:

    ALTER TABLE summary ADD CONSTRAINT summary_date_uniq UNIQUE(`date`);
    

    然后在插入新数据时使用on duplicate key update语法:

    INSERT INTO summary
    (`date_`, `income_`, `expenditure_`, `other_`)
    VALUES (2, '2017-12-22', 100, 10, 80)
    ON DUPLICATE KEY UPDATE
    `income` = `income_` + VALUES(`income_`),
    `expenditure` = `expenditure_` + VALUES(`expenditure_`),
    `others` = `others_` + VALUES(`others_`);
    

    【讨论】:

    • 感谢您的回复..bit 如果我尝试插入收入列等等,我会遇到此错误未知列收入
    • @JoshuaSampson 再次查看了您的 DDL。出于某种模糊的原因,所有列名都以_ 结尾。我已经相应地编辑了我的答案。
    • 我正在尝试更新他正在做的事情,我之所以缩短每件事的原因是正在使用的代码太长,也许我应该发布它,因为这不起作用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    相关资源
    最近更新 更多