0

我尝试按如下方式转换 SQL Server 2008 触发器

Create Trigger [dbo].[TRIGGER_NAME] ON [dbo].[table_sale]
For Insert, Update, Delete
As
Select * From INSERTED Update table_stock Set Stock = Stock - Total
From INSERTED where table_stock.barcode = INSERTED.barcode

进入 MySql 触发器。我无法弄清楚 INSERTED 指的是什么,所以我只是尝试转换如下:

CREATE
TRIGGER `TRIGGER_NAME` AFTER INSERT
ON `table_sale`
FOR INSERT, UPDATE, DELETE
AS
SELECT * FROM INSERTED UPDATE `table_stock` Set `stock` = `stock` - `total`
FROM INSERTED WHERE `table_stock`.`barcode` = INSERTED.`barcode`

然后在我尝试后出现错误消息:

#1064 - You have an error in your SQL syntax; check the manual that corresponds
to your MySQL server version for the right syntax to use near 'INSERT, UPDATE,
DELETE AS SELECT * FROM INSERTED UPDATE table_stock Set stock = sto' at line 4

我确定我所做的 mySql 触发器有很多错误。我很想听听大家的意见。提前致谢。

4

1 回答 1

0

您必须为 INSERT、UPDATE 和 DELETE 创建不同的触发器。

我想你会想要这样的东西:

插入:

CREATE TRIGGER `TRIGGER_NAME` AFTER INSERT
ON `table_sale` FOR EACH ROW
BEGIN    
    UPDATE `table_stock` 
        Set `stock` = `stock` - NEW.`total`     
    WHERE `barcode` = NEW.`barcode`;
END

更新:

CREATE TRIGGER `TRIGGER_NAME` AFTER UPDATE
ON `table_sale` FOR EACH ROW
BEGIN    
    UPDATE `table_stock` 
        Set `stock` = `stock` - `total`     
    WHERE `barcode` = NEW.`barcode`;
END

删除:

CREATE TRIGGER `TRIGGER_NAME` AFTER DELETE
ON `table_sale` FOR EACH ROW
BEGIN

    UPDATE `table_stock` 
        Set `stock` = `stock` - `total`     
    WHERE `barcode` = OLD.`barcode`;
END

我冒昧地将 OLD 放在 DELETE 触发器中,因为那里没有新记录。

这或多或少是您为准确迁移它所做的事情,但从功能的角度来看,您似乎必须对它的功能进行一些研究。

  1. total应该可能来自 NEW 或 OLD,即 new 将来自 table_sale。
  2. 如果在 INSERT 上您从库存中减去,在 DELETE 上您应该添加
  3. 在 UPDATE 上,您可能应该减去 NEW 但添加 OLD,以得到差异。

如果这是真的,您的 SET 行将是:

插入:

Set `stock` = `stock` - NEW.`total` 

更新:

Set `stock` = `stock` - NEW.`total` + OLD.`total`

删除

Set `stock` = `stock` + OLD.`total` 

这是我的两分钱,但我可能错了。:)

于 2013-10-29T00:34:32.667 回答