簡體   English   中英

MySQL If else構造語法

[英]MySQL If else construct syntax

我在使用MySQL的sql觸發器中的if else構造時遇到一些麻煩。 下表僅用於測試。

第一表:

  CREATE TABLE `test2`.`t1` (
  `c1` VARCHAR(5) NOT NULL,
  `c2` VARCHAR(45) NULL,
  `c3` VARCHAR(45) NULL,
  PRIMARY KEY (`c1`));

我的第二張桌子:

    CREATE TABLE `test2`.`t2` (
  `cc1` VARCHAR(5) NOT NULL,
  `cc2` VARCHAR(45) NULL,
  `cc3` VARCHAR(45) NULL,
  PRIMARY KEY (`cc1`));

第三:

CREATE TABLE `test`.`t3` (
  `ccc1` VARCHAR(5) NOT NULL,
  `ccc2` VARCHAR(45) NULL,
  `ccc3` VARCHAR(45) NULL,
  PRIMARY KEY (`cc1`));

c1是cc1和ccc1的主鍵。

我使用的觸發器是:

DROP TRIGGER IF EXISTS `test`.`t1_AFTER_UPDATE`;

DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `t1_AFTER_UPDATE` AFTER UPDATE ON 
`t1` FOR EACH ROW 
BEGIN
DECLARE start varchar(1);
set start=substring((c2),1,1);

 IF(start='S') THEN
     UPDATE t2
     SET cc2 = NEW.c2  
     WHERE cc1 = NEW.c1;
 else

    UPDATE t3
    SET ccc2 = NEW.c2  
    WHERE ccc1 = NEW.c1;
 END IF;
  END$$
  DELIMITER ;

基本上,如果用戶更新了t1.c2,則必須更新t2.cc2或t3.ccc2。 如果NEW.c2的t1.c2以字母S開頭,則必須更新t2.cc2,否則必須更新t3.ccc2。

查詢執行順利,但不會讓我更新c2的值:

Executing:
UPDATE `test2`.`t1` SET `c2` = '24' WHERE (`c1` = 'M123');

Operation failed: There was an error while applying the SQL script to the database.
ERROR 1054: 1054: Unknown column 'c1' in 'field list'
SQL Statement:

在觸發器中,我們指的是用NEW (操作后)和OLD (操作前)關鍵字更新/插入/刪除的行中的列。

您將需要使用這些關鍵字才能訪問這些值。 您可以使用NEW關鍵字從當前表訪問c2值。 當實際修改c2值時,也可以僅通過執行操作來進一步優化。

DROP TRIGGER IF EXISTS `test`.`t1_AFTER_UPDATE`;

DELIMITER $$
USE `test`$$
CREATE DEFINER=`root`@`localhost` TRIGGER `t1_AFTER_UPDATE` AFTER UPDATE ON 
`t1` FOR EACH ROW 
BEGIN
DECLARE start varchar(1) DEFAULT NULL; -- default it to NULL

-- Check if there is any update on c2 column
IF (NEW.c2 <> OLD.c2)

  -- We access the updated value of c2 using NEW keyword
  SET start = SUBSTRING(NEW.c2,1,1);
END IF;

-- Do update operation on other tables only when start is not null
IF (start IS NOT NULL) THEN

  IF (start = 'S') THEN
     UPDATE t2
     SET cc2 = NEW.c2  
     WHERE cc1 = NEW.c1;
  ELSE

     UPDATE t3
     SET ccc2 = NEW.c2  
     WHERE ccc1 = NEW.c1;
  END IF;
END IF;

END$$
DELIMITER ;

觸發器文檔中的一些值得注意的要點:

在觸發器主體內,使用OLD和NEW關鍵字可以訪問受觸發器影響的行中的列。 OLD和NEW是MySQL對觸發器的擴展; 它們不區分大小寫。

在INSERT觸發器中,只能使用NEW.col_name。 沒有舊的行。 在DELETE觸發器中,只能使用OLD.col_name。 沒有新行。 在UPDATE觸發器中,可以使用OLD.col_name引用更新前的行的列,並使用NEW.col_name引用更新后的行的列。

除了start的定義,觸發器基本上看起來還不錯。 列引用缺少對new.的引用new. 錯誤消息使我感到困惑,盡管錯誤消息應該在c2而不是c1

無論如何,我只是省去了它:

DELIMITER $$
USE `test`$$

CREATE DEFINER=`root`@`localhost` TRIGGER `t1_AFTER_UPDATE` AFTER UPDATE ON 
`t1` FOR EACH ROW 
BEGIN
    IF (new.c2 LIKE 'S%') THEN
        UPDATE t2
            SET cc2 = NEW.c2  
            WHERE cc1 = NEW.c1;
    ELSE
        UPDATE t3
            SET ccc2 = NEW.c2  
            WHERE ccc1 = NEW.c1;
    END IF;
END$$

DELIMITER ;

您還需要修正t3的定義。 主鍵列不存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM