2016-12-26 43 views
4

我目前正在研究Java Swing应用程序。该应用程序允许用户执行不同类型的交易。我在MS SQL中创建了一些表来存储用户数据。以下是我目前面临的问题。如何在触发器的帮助下更新不同SQL表中的行

我有一张名为“UList”的表格,其中包含有关用户的所有信息。这个特定的表格还包含一个称为“平衡”的列,它将保持用户的平衡。还有另一张名为“存款”的表格,它将持有存款金额。

的表格:

Ulist

╔══════╦═════════╗ 
║ id ║ balance ║ 
╠══════╬═════════╣ 
║ 1 ║ 6000 ║ 
║ 2 ║ 4000 ║ 
╚══════╩═════════╝ 

存款

╔══════╦══════╗ 
║ amt ║ id ║ 
╠══════╬══════╣ 
║ 1000 ║ 2 ║ 
║ 1000 ║ 1 ║ 
║ 500 ║ 1 ║ 
║ 500 ║ 1 ║ 
╚══════╩══════╝ 

现在每当用户将执行事务时,AMT将以存款表被插入和将在外键ID的帮助下更新/添加到余额中。我尝试了以下触发器,但它无法按预期工作。

create trigger d_trigger 
ON Deposits 
AFTER INSERT 
AS 
UPDATE u set u.balance=u.balance+d.amt from UList u INNER JOIN deposits d on u.id=d.id INNER JOIN inserted i on i.id=d.id 

当我插入相同的数字时,此触发器工作。如果我插入500,那么它将成功地在余额中添加500,但是当我使用另一个数字1000时,它将更新不正确的值。我在不同的桌子上有几个触发器,它们执行类似的操作,如提款,转账等。

我们将非常感谢您对此问题的帮助!

注意:如果您想知道是否是造成此问题的Java代码。我已经在应用程序和MS SQL Server中尝试了这一点。

+0

这是因为您的连接条件查找'deposit'表中已经存在相同'id'的多个条目。您需要捕获'deposit'的'insert'语句中给出的'amount'和'id'。 – Utsav

回答

2

无需在您的触发器上存入INNER JOIN表。这应该工作:

alter trigger d_trigger 
ON Deposits 
AFTER INSERT 
AS 
    UPDATE u 
    set u.balance=u.balance+i.amt 
    from UList u 
    INNER JOIN inserted i on i.u_Id=u.u_Id 
+0

这工作就像一个魅力!非常感谢您花费宝贵的时间回答我的问题:)。对此,我真的非常感激。 – SZaidH

0

未经测试,但其想法是使用简单的更新语句设置该值。毫无疑问,这是你错误的原因。

create trigger d_trigger 
ON Deposits 
AFTER INSERT 
AS 
UPDATE UList set balance = balance + :new.amt 
WHERE id = :new.id;