如何在 phpMyAdmin 中使用 MySQL 构建条件过程以对多个表进行操作(if-then-insert-else-update)

How to build a conditional Procedure to operate (if-then-insert-else-update) on multiple tables using MySQL in phpMyAdmin

我用MySQL管理数据库。

我在名为 WIFI 的数据库中有 2 个 table 名为 IDENTITY 和 OPTIONS。
IDENTITY 包含 2 个字段:USERNAME 和 PASSWORD。
OPTIONS 包含 3 个字段:USERNAME、WIFI_SSID 和 WIFI_PASSWORD.
并且有一个程序接受这些变量作为参数:
arg01_USERNAME
arg02_PASSWORD
arg03_WIFI_SSID
arg04_WIFI_PASSWORD

我想在 phpMyAdmin 中构建一个程序来执行此操作:

此过程应检查 arg01_USERNAME 和 arg02_PASSWORD 是否与 IDENTITY 中的数据匹配。如果未找到数据,则什么也不做。否则在 table OPTIONS 中搜索 arg01_USERNAME 并使用 arg03_WIFI_SSID 和 arg04_WIFI_PASSWORD 更新 WIFI_SSID 和 WIFI_PASSWORD。如果在OPTIONS中没有找到arg01_USERNAME,则在OPTIONS中插入一条新记录。

这里是定义过程的SQL查询:

CREATE DEFINER=`WIFI`@`localhost` PROCEDURE `INSERT`(IN `arg01_USERNAME` INT(20) UNSIGNED, IN `arg02_PASSWORD` VARCHAR(32), IN `arg03_WIFI_SSID` VARCHAR(32) CHARSET utf8, IN `arg04_WIFI_PASSWORD` VARCHAR(32) CHARSET utf8)
    NO SQL
IF EXISTS (
    SELECT COUNT(*) 
    FROM `WIFI`.`IDENTITY` 
    WHERE `USERNAME` = arg01_USERNAME AND `PASSWORD` = arg02_PASSWORD)
THEN
    INSERT INTO `WIFI`.`OPTIONS` (
        `USERNAME`,
        `WIFI_SSID`,
        `WIFI_PASSWORD`
    ) VALUES (
        arg01_USERNAME,
        arg03_WIFI_SSID,
        arg04_WIFI_PASSWORD
    )
    ON DUPLICATE KEY UPDATE
        `WIFI_SSID` = arg03_WIFI_SSID,
        `WIFI_PASSWORD` = arg04_WIFI_PASSWORD
END IF;
ENGINE=InnoDB DEFAULT CHARSET=utf8

你能指出这段代码有什么问题吗?
当我尝试使用此代码定义过程时,phpMyAdmin 告诉我代码的 "END IF" 部分附近存在语法错误(错误 1064)。
抱歉我的英语不好。

  • 您需要将 Delimiter 重新定义为其他内容,例如:$$,以便解析器在看到 ;
  • 时不会触发查询执行
  • 最后,将分隔符重新定义回 ;

尝试:

DELIMITER $$

CREATE DEFINER=`WIFI`@`localhost` PROCEDURE `INSERT`(IN `arg01_USERNAME` INT(20) UNSIGNED, IN `arg02_PASSWORD` VARCHAR(32), IN `arg03_WIFI_SSID` VARCHAR(32) CHARSET utf8, IN `arg04_WIFI_PASSWORD` VARCHAR(32) CHARSET utf8)
    NO SQL
IF EXISTS (
    SELECT COUNT(*) 
    FROM `WIFI`.`IDENTITY` 
    WHERE `USERNAME` = arg01_USERNAME AND `PASSWORD` = arg02_PASSWORD)
THEN
    INSERT INTO `WIFI`.`OPTIONS` (
        `USERNAME`,
        `WIFI_SSID`,
        `WIFI_PASSWORD`
    ) VALUES (
        arg01_USERNAME,
        arg03_WIFI_SSID,
        arg04_WIFI_PASSWORD
    )
    ON DUPLICATE KEY UPDATE
        `WIFI_SSID` = arg03_WIFI_SSID,
        `WIFI_PASSWORD` = arg04_WIFI_PASSWORD;
END IF $$

DELIMITER ;