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 总是导致自动递增的主键生成,而在特定服务器选项设置中需要零。