如何在 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 ;
我用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 ;