【问题标题】:Update stock table through the invoice table in MySQL通过 MySQL 中的 invoice 表更新 stock 表
【发布时间】:2013-09-19 01:56:36
【问题描述】:

我有三个表,分别是customerstockinvoice

customer table PK is CNo(Customer No)
stock table PK is PNo(Product NO)

invoice 表获取两个 PK(来自 customer 表的 CNo 和来自 stock 表的 PNo)作为其关联键。

我想做的是,通过invoice 表更新股票表QuntyAvailable 列。

例如。当客户从PNo 2(即 Dettol)获得 2 个 Quantities 时,它会自动将上述产品自己行的库存表 QuntyAvailable 列更新为 18(QuntyAvailable-Qty)。

我多次尝试各种查询,但只得到错误。像PK不能更新.. 呜呜呜……

请帮助我,谢谢。

customer table

CNo(PK)   | Name        | Address
1         | Jhon        | 23, Hill St, NY.
2         | Sam         | 24, Bejin , Chaina.
3         | Nic         | 25, London ,England.


stock table

PNo(PK)  | Description   | Each Price  | QntyAvailable
1        | Dettol        | $2          |   10
2        | Astra         | $5          |   20


invoice table

CNo(PK)    | PNo(PK)    | Qty      | value
1          | 2          | 2        | $10
2          | 1          | 3        | $6        

更新完成后,我想要这样的库存表...

 stock table

PNo(PK)  | Description   | Each Price  | QntyAvailable
1        | Dettol        | $2          |   7
2        | Astra         | $5          |   18

请帮帮我..我正在使用 mysql 服务器和 netbeans IDE

我的查询 -------------

s.executeUpdate("INSERT INTO invoice(CNo,PNo,Qty,Value) VALUES('1','2','10','150')"); s.executeUpdate("更新库存集 QuntyAvailable=QuntyAvailable-10 WHERE Pno ='2'");

【问题讨论】:

  • 感谢您发布您的要求。现在请发布您的尝试...
  • 你目前使用的查询是什么?
  • s.executeUpdate("INSERT INTO invoice(CNo,PNo,Qty,Value) VALUES('1','2','10','150')"); s.executeUpdate("更新库存集 QuntyAvailable=QuntyAvailable-10 WHERE Pno ='2'");
  • 我用这段代码尝试了很多,但我无法解决错误。代码 -- 在发票上插入后创建触发器 UpdateStoock 为每行开始更新股票 SET QntyAvailable=(QntyAvailable-new.Qty) WHERE Pno =new.Pno Error is "com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in您的 SQL 语法;查看与您的 MySQL 服务器版本相对应的手册,以了解在第 1 行的 '' 附近使用的正确语法“帮助

标签: java mysql sql


【解决方案1】:

如果您想在发票中插入时更新股票表,您可以在插入后使用您为插入所拥有的数据进行更新(就像您尝试过的那样,唯一看起来错误的是='2' 看起来应该只是 =2) 或在触发器中执行,让新插入的值提供更新:

CREATE TRIGGER updateStock AFTER INSERT ON invoice
  FOR EACH ROW BEGIN
      UPDATE stock set QntyAvailable=QntyAvailable- new.Qty WHERE Pno =new.Pno;
  END;
//

您可以查看this fiddle 来查看它是否正常工作。

附言

您确实应该有一个 InvoiceID。您构建它的方式是不允许客户两次购买相同的产品。

附: 2 - 您创建触发器的错误与未设置 DELIMITER 有关。 如果你不设置它,语句将在第一个结束;您需要在触发器之前设置它并用它结束您的触发器定义。之后,您可以将分隔符设置回;。

DELIMITER //
CREATE TRIGGER updateStock AFTER INSERT ON invoice
  FOR EACH ROW BEGIN
      UPDATE stock set QntyAvailable=QntyAvailable- new.Qty WHERE Pno =new.Pno;
  END;
//
DELIMITER ;

【讨论】:

  • 只是另一个提醒 P.S.你真的应该在发票表中添加一个 invoiceID。如果您最终发现这有助于解决您的问题,请不要忘记接受答案。
  • 我用这段代码尝试了很多,但我无法解决错误。代码 -- 在发票上插入后创建触发器 UpdateStoock 为每行开始更新股票 SET QntyAvailable=(QntyAvailable-new.Qty) WHERE Pno =new.Pno Error is "com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: You have an error in您的 SQL 语法;查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 1 行的“帮助”附近使用正确的语法
  • 你错过了 END;如果您使用 mysql 控制台创建它,则必须将 DELIMITER // 放在 CREATE TRIGGER 之前并以 // 结束
猜你喜欢
  • 1970-01-01
  • 2017-01-06
  • 1970-01-01
  • 2015-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多