0

我有三个表,它们是customer, stock, invoice

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

invoice 表同时获取 PK(表中的 CNo 和customer表中的 PNo stock)作为其关联键。

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

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

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

请帮帮我谢谢。

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'");

4

1 回答 1

0

如果您想在发票中插入时更新股票表,您可以在插入后使用您为插入所拥有的数据进行更新(就像您尝试过的那样,唯一看起来错误的是='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;
//

您可以检查此小提琴以查看它是否正常工作。

附言

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

PS 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 ;
于 2013-09-14T14:11:15.260 回答