MySQL 使用带@Parameter 的 IF 语句的过程不起作用
MySQL PROCEDURE using IF Statement with @Parameter Not Working
为什么我执行程序的时候table上没有插入数据,代码好像少了什么?
我正在 phpMyAdmin > myDatabase > Procedures“Routines Tab”上测试程序并单击“Execute”,使用模式提示并询问“@idproc 和@nameproc”的值。
我尝试只使用 INSERT 代码,但当我添加 IF 条件时,它不起作用。
Using XAMPP 8.0.3,
10.4.18-MariaDB
DELIMITER $$
CREATE DEFINER=`root`@`localhost:3307` PROCEDURE `testproc`(IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
IF @idproc = 0 THEN
INSERT INTO testproc(
id,
name)
VALUES(
@idproc,
@nameproc
);
ELSE
UPDATE testproc
SET
id = @idproc,
name = @nameproc
WHERE id = @idproc;
END IF;
SELECT * FROM testproc;
END$$
DELIMITER ;
你混合 local variables (their names have not leading @
) and user-defined variables(单前导 @
)。这是两种不同的变量类型,具有不同的范围和数据类型规则。过程参数也是局部变量。
因此,当您使用以前未使用过的 UDV 时,您会收到 NULL 作为其值 - 并且您的代码无法正常工作。处处使用 LV:
CREATE DEFINER=`root`@`localhost:3307`
PROCEDURE `testproc` (IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
IF idproc = 0 THEN
INSERT INTO testproc (name) VALUES (nameproc);
ELSE
UPDATE testproc SET name = nameproc WHERE id = idproc;
END IF;
SELECT * FROM testproc;
END
您没有检查指定的 idproc
值是否存在于 table 中。如果指定(非零)但不存在,则您的 UPDATE 不会更新任何内容。假设 id
是 table 的自动递增主键,我建议使用
CREATE DEFINER=`root`@`localhost:3307`
PROCEDURE `testproc` (IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
INSERT INTO testproc (id, name)
VALUES (idproc, nameproc)
ON DUPLICATE KEY
UPDATE name = VALUES(name);
SELECT * FROM testproc;
END
如果指定 idproc
值存在于 id
列中,将更新该行,否则将插入新行。
此外 - 我建议您在要插入具有指定 nameproc
值的新行时提供 NULL 值而不是零。 NULL 总是导致自动递增的主键生成,而在特定服务器选项设置中需要零。
为什么我执行程序的时候table上没有插入数据,代码好像少了什么?
我正在 phpMyAdmin > myDatabase > Procedures“Routines Tab”上测试程序并单击“Execute”,使用模式提示并询问“@idproc 和@nameproc”的值。
我尝试只使用 INSERT 代码,但当我添加 IF 条件时,它不起作用。
Using XAMPP 8.0.3, 10.4.18-MariaDB
DELIMITER $$
CREATE DEFINER=`root`@`localhost:3307` PROCEDURE `testproc`(IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
IF @idproc = 0 THEN
INSERT INTO testproc(
id,
name)
VALUES(
@idproc,
@nameproc
);
ELSE
UPDATE testproc
SET
id = @idproc,
name = @nameproc
WHERE id = @idproc;
END IF;
SELECT * FROM testproc;
END$$
DELIMITER ;
你混合 local variables (their names have not leading @
) and user-defined variables(单前导 @
)。这是两种不同的变量类型,具有不同的范围和数据类型规则。过程参数也是局部变量。
因此,当您使用以前未使用过的 UDV 时,您会收到 NULL 作为其值 - 并且您的代码无法正常工作。处处使用 LV:
CREATE DEFINER=`root`@`localhost:3307`
PROCEDURE `testproc` (IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
IF idproc = 0 THEN
INSERT INTO testproc (name) VALUES (nameproc);
ELSE
UPDATE testproc SET name = nameproc WHERE id = idproc;
END IF;
SELECT * FROM testproc;
END
您没有检查指定的 idproc
值是否存在于 table 中。如果指定(非零)但不存在,则您的 UPDATE 不会更新任何内容。假设 id
是 table 的自动递增主键,我建议使用
CREATE DEFINER=`root`@`localhost:3307`
PROCEDURE `testproc` (IN `idproc` INT, IN `nameproc` VARCHAR(100))
BEGIN
INSERT INTO testproc (id, name)
VALUES (idproc, nameproc)
ON DUPLICATE KEY
UPDATE name = VALUES(name);
SELECT * FROM testproc;
END
如果指定 idproc
值存在于 id
列中,将更新该行,否则将插入新行。
此外 - 我建议您在要插入具有指定 nameproc
值的新行时提供 NULL 值而不是零。 NULL 总是导致自动递增的主键生成,而在特定服务器选项设置中需要零。