Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL根据另一个表中的条目触发从一个表添加/减少_Mysql - Fatal编程技术网

MySQL根据另一个表中的条目触发从一个表添加/减少

MySQL根据另一个表中的条目触发从一个表添加/减少,mysql,Mysql,所以,我有两个表:转移和库存 我想做的是,当在传输表中输入某个内容时,它将更改库存表中的一个条目 我需要的一个例子是: 假设有一个叫琼斯博士的人和另一个叫史密斯博士的人。琼斯博士总共有30英镑,史密斯博士有10英镑。现在,假设琼斯博士给史密斯博士10英镑,我需要库存表中琼斯博士账户总额的-10英镑,史密斯博士账户总额的+10英镑。因此,当您刷新该表时,它会在总计列中说明Smith博士的余额为20英镑,而Jones博士的余额现在也为20英镑 我想通过一个触发器来实现这一点。我目前有以下情况: DE

所以,我有两个表:转移和库存

我想做的是,当在传输表中输入某个内容时,它将更改库存表中的一个条目

我需要的一个例子是:

假设有一个叫琼斯博士的人和另一个叫史密斯博士的人。琼斯博士总共有30英镑,史密斯博士有10英镑。现在,假设琼斯博士给史密斯博士10英镑,我需要库存表中琼斯博士账户总额的-10英镑,史密斯博士账户总额的+10英镑。因此,当您刷新该表时,它会在总计列中说明Smith博士的余额为20英镑,而Jones博士的余额现在也为20英镑

我想通过一个触发器来实现这一点。我目前有以下情况:

DELIMITER $$
CREATE TRIGGER update_inventory_through_transfer AFTER INSERT ON Transfers
FOR EACH ROW
BEGIN
UPDATE Inventory
SET Inventory.total = SELECT SUM (IF (owner = NEW.owner, -total, total)) FROM Transfers WHERE owner = NEW.owner
END$$
DELIMITER;
谁能帮我找出哪里出了问题?
谢谢

您的问题不清楚db的结构,但是假设transfer知道所有者和资金被转移到谁,那么触发器应该包含两个简单的更新,因为每行都有一个触发器,所以没有必要对转账进行求和

drop table if exists transfer,inventory;

create table transfer (owner int,total int,tfr_to int);
create table inventory (owner int,total int);

insert into inventory values
(1,30),(2,10);

drop trigger if exists t; 
DELIMITER $$
CREATE TRIGGER t AFTER INSERT ON transfer
FOR EACH ROW
BEGIN
    UPDATE inventory t1
        SET t1.total = t1.total + new.total 
    where t1.owner = new.tfr_to;
    update inventory t1
        set t1.total = t1.total - new.total
    where t1.owner = new.owner;
END $$
DELIMITER ;

insert into transfer values (1,10,2);

select * from transfer;

+-------+-------+--------+
| owner | total | tfr_to |
+-------+-------+--------+
|     1 |    10 |      2 |
+-------+-------+--------+
1 row in set (0.02 sec)

select * from inventory;

+-------+-------+
| owner | total |
+-------+-------+
|     1 |    20 |
|     2 |    20 |
+-------+-------+
2 rows in set (0.00 sec)

错误消息是什么,或者到目前为止您尝试了什么?错误消息是标准1064:您的SQL语法中有一个错误:如果owner=NEW.owner,请选择SUM,-total,其中owner=NEW的传输总计。我需要通过触发器来完成这项工作,我认为这会起作用,但显然不是grrr。要修复语法错误,请将select括在括号中并终止它-但我认为逻辑不正确,