[英]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.