【问题标题】:Converting Trigger of SQL Server to MySQL将 SQL Server 的触发器转换为 MySQL
【发布时间】:2021-05-18 18:32:24
【问题描述】:

我正在将我的数据库从 SQL Server 转换为 MySQL。我遇到了有关触发器的问题。

这是我的 SQL Server 代码

--IF A SALE IS DELETE WHICH WHICH INCLUDED AN ITEM FROM ORDER THEN ORDER SHOULD BE PENDING AS IT IS NOT DELIEVERED
GO 
CREATE TRIGGER UPDATE_ORDER_ON_SALE_DELETE
ON STOCKS
FOR UPDATE
AS
IF EXISTS (SELECT BARCODE FROM ORDER_ITEMS WHERE BARCODE= ALL(SELECT BARCODE FROM inserted))
BEGIN
UPDATE ORDERS 
SET ORDER_STATUS = 'PENDING' 
WHERE ORDER_ID =ALL (SELECT ORDER_ID 
                  FROM ORDER_ITEMS 
                  WHERE BARCODE = ALL(SELECT BARCODE 
                                    FROM inserted));
                                    END

我已将其转换为 MySQL,如下所示

CREATE TRIGGER `UPDATE_ORDER_ON_SALE_DELETE` AFTER UPDATE ON `stocks` FOR EACH ROW 

IF EXISTS (SELECT BARCODE FROM ORDER_ITEMS WHERE BARCODE = NEW.BARCODE)
BEGIN
    UPDATE ORDERS 
    SET ORDER_STATUS = 'PENDING' 
    WHERE ORDER_ID =ALL (SELECT ORDER_ID 
                      FROM ORDER_ITEMS 
                      WHERE BARCODE =  NEW.BARCODE);
END

我收到此错误

#1064 - 您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解要使用的正确语法 在“开始”附近 更新订单 SET ORDER_STATUS = '待定' 第 4 行的 WHERE ORDER_ID'

我尝试了不同的代码变体,但我认为我在 IF EXISTS 语句中遇到了错误

我也试过

CREATE TRIGGER `UPDATE_ORDER_ON_SALE_DELETE` AFTER UPDATE ON `stocks` FOR EACH ROW 

IF EXISTS (SELECT BARCODE FROM ORDER_ITEMS WHERE BARCODE = (SELECT BARCODE FROM NEW.BARCODE))
BEGIN
    UPDATE ORDERS 
    SET ORDER_STATUS = 'PENDING' 
    WHERE ORDER_ID =ALL (SELECT ORDER_ID 
                      FROM ORDER_ITEMS 
                      WHERE BARCODE =  (SELECT BARCODE FROM NEW.BARCODE));
END

【问题讨论】:

  • 所有代码都必须在 BEGIN-END 块内,而不是在它之外。

标签: mysql mariadb


【解决方案1】:

仅语法更正:

CREATE TRIGGER `UPDATE_ORDER_ON_SALE_DELETE` 
AFTER UPDATE 
ON `stocks` 
FOR EACH ROW 
    UPDATE ORDERS 
    SET ORDER_STATUS = 'PENDING' 
    WHERE ORDER_ID = ALL (SELECT ORDER_ID 
                          FROM ORDER_ITEMS 
                          WHERE BARCODE = NEW.BARCODE)
      AND EXISTS (SELECT BARCODE 
                  FROM ORDER_ITEMS 
                  WHERE BARCODE = NEW.BARCODE);

从另一边:

    WHERE ORDER_ID = ALL (SELECT ORDER_ID 
                          FROM ORDER_ITEMS 
                          WHERE BARCODE = NEW.BARCODE)

检查ORDER_ITEMS 表中的NEW.BARCODE 条形码值是否仅存在一个ORDER_ID 值。有点奇怪……

另外 - 如果存在这样的值,那么该行也存在(显然),以及下一个条件

          EXISTS (SELECT BARCODE 
                  FROM ORDER_ITEMS 
                  WHERE BARCODE = NEW.BARCODE)

是多余的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-15
    • 2018-03-28
    • 2011-09-11
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多