Mysql 不更新表行的过程

Mysql 不更新表行的过程,mysql,sql,stored-procedures,mysqli,Mysql,Sql,Stored Procedures,Mysqli,我有这个程序(不要太费心去弄清楚它是做什么的,针对名为“修改1,2,3,4”的注释) 除了线条之外,这一切都很好 UPDATE user_info SET notifications = 1 WHERE user_id = 1; 不会工作,但在简单的纯SQL(phpmyadmin)中,此查询工作正常。有什么问题 这个脚本做什么?它可以帮助我向某些用户发布通知,并且当您在group1中发布某些内容时,必须向该组中拥有right101权限的所有用户发出通知,如下所示: UPDATE user_

我有这个程序(不要太费心去弄清楚它是做什么的,针对名为“修改1,2,3,4”的注释)

除了线条之外,这一切都很好

 UPDATE user_info SET notifications = 1 WHERE user_id = 1;
不会工作,但在简单的纯SQL(phpmyadmin)中,此查询工作正常。有什么问题

这个脚本做什么?它可以帮助我向某些用户发布通知,并且当您在group1中发布某些内容时,必须向该组中拥有right101权限的所有用户发出通知,如下所示:

 UPDATE user_info SET notifications = notifications  + 1 WHERE user_id = var_user_id;
使用游标作为循环的
FOR
,就像我以前在PHP中使用的那样

这有什么问题?程序不能更新数据吗?!
希望我能让自己理解。

听起来不太自以为是,但这些数据能让你通过考试吗

IF num_rows = 0

不过,作为提示,如果您在SQL Management studio中运行,则可以像普通代码一样使用断点调试SQL。我建议在这条线上设置一个断点,看看它是否真的被击中了

听起来不太自以为是,但数据是否允许您通过

IF num_rows = 0

不过,作为提示,如果您在SQL Management studio中运行,则可以像普通代码一样使用断点调试SQL。我建议在这条线上设置一个断点,看看它是否真的被击中了

沿着这条路走怎么样?我通常在SQL Server中工作,因此如果某些语法不正确,我很抱歉,但我添加了一些注释,希望您能理解要点

/* PROCEDURE 1 : Post notification */ 
DROP PROCEDURE IF EXISTS AddNotificationOnPosts; 

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNotificationOnPosts`(arg_from_user INT(11), arg_on_post_id INT(11), arg_group_id INT(11)) 
BEGIN 

    -- sanity checks
    IF(arg_from_user IS NULL OR arg_from_user = '') 
    THEN 
        RETURN 0;
    ELSEIF(arg_on_post_id IS NULL OR arg_on_post_id <= 0) 
    THEN 
        RETURN 0;
    ELSEIF(arg_in_group_id IS NULL OR arg_in_group_id <= 0) 
    THEN 
        RETURN 0;
    END IF;

    BEGIN TRAN;

    -- insert if notification post does not exist
    IF NOT EXISTS
    ( 
        SELECT * 
        FROM notification_posts
        WHERE  
            from_user = arg_from_user AND 
            on_post_id = arg_on_post_id AND 
            in_group_id = arg_in_group_id 
    )               
    THEN

        INSERT INTO notifications_posts
        (
            from_user,
            on_post_id,
            in_group_id
        ) 
        VALUES
        (
            arg_from_user,
            arg_on_post_id,
            arg_in_group_id
        ); 
    END IF;


    -- update all users with 101 right

    UPDATE ui 
        SET notifications = notifications + 1
    FROM user_info ui
    JOIN user_rights ur on ur.user_id = ui.user_id
    WHERE ur.right = 101 and ur.group_id = arg_in_group_id

    COMMIT;
END $$ 
DELIMITER ; 
/*程序1:通知后*/
删除程序(如果存在)AddNotificationPosts;
分隔符$$
CREATE DEFINER=`root`@`localhost`过程`AddNotificationOnPosts`(arg\u from\u user INT(11)、arg\u on\u post\u id INT(11)、arg\u group\u id INT(11))
开始
--健康检查
IF(arg_from_user为NULL或arg_from_user='')
然后
返回0;

ELSEIF(arg_on_post_id为NULL或arg_on_post_id如何处理这些问题?我通常在SQL Server中工作,因此如果某些语法不正确,我深表歉意,但我添加了一些注释,希望您能理解要点

/* PROCEDURE 1 : Post notification */ 
DROP PROCEDURE IF EXISTS AddNotificationOnPosts; 

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `AddNotificationOnPosts`(arg_from_user INT(11), arg_on_post_id INT(11), arg_group_id INT(11)) 
BEGIN 

    -- sanity checks
    IF(arg_from_user IS NULL OR arg_from_user = '') 
    THEN 
        RETURN 0;
    ELSEIF(arg_on_post_id IS NULL OR arg_on_post_id <= 0) 
    THEN 
        RETURN 0;
    ELSEIF(arg_in_group_id IS NULL OR arg_in_group_id <= 0) 
    THEN 
        RETURN 0;
    END IF;

    BEGIN TRAN;

    -- insert if notification post does not exist
    IF NOT EXISTS
    ( 
        SELECT * 
        FROM notification_posts
        WHERE  
            from_user = arg_from_user AND 
            on_post_id = arg_on_post_id AND 
            in_group_id = arg_in_group_id 
    )               
    THEN

        INSERT INTO notifications_posts
        (
            from_user,
            on_post_id,
            in_group_id
        ) 
        VALUES
        (
            arg_from_user,
            arg_on_post_id,
            arg_in_group_id
        ); 
    END IF;


    -- update all users with 101 right

    UPDATE ui 
        SET notifications = notifications + 1
    FROM user_info ui
    JOIN user_rights ur on ur.user_id = ui.user_id
    WHERE ur.right = 101 and ur.group_id = arg_in_group_id

    COMMIT;
END $$ 
DELIMITER ; 
/*程序1:通知后*/
删除程序(如果存在)AddNotificationPosts;
分隔符$$
CREATE DEFINER=`root`@`localhost`过程`AddNotificationOnPosts`(arg\u from\u user INT(11)、arg\u on\u post\u id INT(11)、arg\u group\u id INT(11))
开始
--健康检查
IF(arg_from_user为NULL或arg_from_user='')
然后
返回0;

ELSEIF(arg_on_post_id为NULL或arg_on_post_id是此查询插入通知_posts(从_用户、在_post_id、在_组_id中)值(arg_from_用户、arg_on_post_id、在_组_id中);选择行计数()insert\u result;正在运行?我不知道,但insert-INTO工作正常…但我不相信insert-INTO正在运行,因为无论我如何进行更新,它都不会工作…是否可能在IF中(arg\u from\u user为NULL或arg\u from\u user=“”)语句一个条件为true?其他条件未运行?因为在本例中,num_行为NULL。运行此语句后,响应为1,并插入该特定行,但现在不执行更新。明白了吗?此查询是否插入通知_posts(来自_user,在_post_id上,在_group_id中)值(arg_from_user,arg_on_post_id,arg_in_group_id);在insert_result中选择ROW_COUNT();正在运行?我不知道,但是insert-in-fineMySQL…但我不相信insert-in正在运行,因为无论我如何进行更新,它都不会工作…是否可能在IF中(arg_from_user为NULL或arg from_-user='')语句一的条件为true?其他条件不运行?因为在本例中,num_行为NULL。运行此语句后,响应为1,并插入该特定行,但现在不执行更新。明白了吗?首先,什么是制动点,第二,我应该使用事务吗?请注意,我使用的是游标,这样可能会更改lotA断点是代码中的停止点。您可以使用它在某个点停止代码并查看当前状态(例如,所有变量的值以及实际返回的方法).SQL Server Management Studio允许您使用SQL代码执行此操作,您可以看到问题所在。但是,由于您使用MYSQL标记了此操作,因此我认为它与您无关,因此无需担心:)它还带有SQL标记。如果您使用的是SQL Management Studio和SQL数据库,则可以在要检查的SQL行上放置断点。然后按“播放”按钮或F5可以进入调试模式。这将允许您通过按f10逐行检查代码(注意,您也可以使用此选项进入存储过程)。再次按f5键,您将跳到下一个断点。通过在代码上设置断点,您可以检查该行代码是否已执行。此外,您还可以“监视”变量并查看正在传递的值。首先,什么是断点,第二,我应该使用事务吗?请注意,我使用的是游标,这样可能会更改lotA断点,因为它是代码中的停止点。您可以使用它在某个点停止代码并查看当前状态(例如,所有变量的值以及实际返回的方法)。SQL Server Management Studio允许您使用SQL代码执行此操作,您可以看到问题所在。但是,由于您使用MYSQL标记了此操作,我认为它与您无关,因此无需担心:)它还带有SQL标记。如果您使用的是SQL Management Studio和SQL数据库,则可以在要检查的SQL行上放置断点。然后按“播放”按钮或F5可以进入调试模式。这将允许您通过按f10逐行检查代码(注意,您也可以使用此选项进入存储的进程)。再次按f5键,您将跳到下一个断点。通过在代码上设置断点,您可以检查该行代码是否已执行。此外,您还可以“监视”变量并查看v