gpt4 book ai didi

mysql - 在 MySql Workbench 6.2 中调用 MySQL 存储过程时,影响 2 行而不是 1 行

转载 作者:行者123 更新时间:2023-11-29 03:32:56 25 4
gpt4 key购买 nike

我是存储过程的新手。首先,我在 MySQL 中定义了这样的存储过程。我起诉 MySQL Workbench 6.2

delimiter //
create procedure usp_processUser(
in vu360UserId bigint(20),
in vu360UserNamevarchar(255),
in vu360UserGuid varchar(50),
in email varchar(50),
in firstName varchar(255),
in lastName varchar(255),
in notifyLicenseExpiration bit(1),
in createdDate timestamp,
in updatedDate timestamp
)
begin
if not exists(select * from `AutoAlerts`.`User` where VU360UserID = vu360UserId)
then
insert into `AutoAlerts`.`User` (`VU360UserID`, `VU360UserName`, `UserGuid`, `Email`, `FirstName`, `LastName`, `Notify_License_Expiration`, CreatedDate) VALUES (vu360UserId, vu360UserName, userGuid, email, firstName, lastName, notifyLicenseExpiration, createdDate);
else
UPDATE `AutoAlerts`.`User` SET `VU360UserName`=vu360UserName, `UserGuid`=userGuid, `Email`=email, `FirstName`=firstName, `LastName`=lastName, `Notify_License_Expiration`=notifyLicenseExpiration, UpdatedDate=updatedDate WHERE `VU360UserID`=vu360UserId;
end if;
end//
DELIMITER ;

然后像这样调用这个存储过程

call usp_processUser(1231, 'abc@hotmail.com', 'aasdsad', 'abc@gmail.com', 'xxx', 'yyy', 1, '2014-06-25 08:33:40', '2014-12-05 12:00:14');

此过程正在执行,但在工作台中,我有时会收到 165 行影响,有时会收到 1 行影响

然后我使用 on duplicate key 定义了相同的过程,如下所示

delimiter //
create procedure usp_processUser(
in vu360UserId bigint(20),
in vu360UserName varchar(255),
in vu360UserGuid varchar(50),
in email varchar(50),
in firstName varchar(255),
in lastName varchar(255),
in notifyLicenseExpiration bit(1),
in createdDate timestamp,
in updatedDate timestamp
)
begin
insert into `AutoAlerts`.`User` (`VU360UserID`, `VU360UserName`, `UserGuid`, `Email`, `FirstName`, `LastName`, `Notify_License_Expiration`, CreatedDate)
VALUES (vu360UserId, vu360UserName, userGuid, email, firstName, lastName, notifyLicenseExpiration, createdDate)
on duplicate key update `VU360UserName`=vu360UserName, `UserGuid`=userGuid, `Email`=email, `FirstName`=firstName, `LastName`=lastName, `Notify_License_Expiration`=notifyLicenseExpiration, UpdatedDate=updatedDate;
end//
DELIMITER ;

然后这样调用

call usp_processUser(1231, 'def@hotmail.com', 'asdasd12312', 'abc@gmail.com', 'xxx', 'yyy', 0, NULL, '2014-12-05 12:00:14');

此过程也在执行,但我不断收到 2 行影响。我想问为什么 2 行。当我选择像

这样的查询时
SELECT * FROM User where VU360UserID = 1231;

然后我只得到一条记录。我想问的是这个东西即有时收到消息 1 行、2 行、165 行受到影响 是工作台相关的还是我在我的存储过程中做错了什么?

谢谢

最佳答案

根据 Local Variable Scope and Resolution 记录:

A local variable should not have the same name as a table column. If an SQL statement, such as a SELECT ... INTO statement, contains a reference to a column and a declared local variable with the same name, MySQL currently interprets the reference as the name of a variable.

此外,如 CREATE PROCEDURE and CREATE FUNCTION Syntax 中所述:

Parameter names are not case sensitive.

因为您已使用与表列仅字母大小写不同的名称命名参数,然后尝试在 WHERE 子句中引用那些没有限定符的表列(碰巧在其他任何地方都使用列名是明确的),MySQL 因此将这些子句评估为重言式:即 WHERE VU360UserID=vu360UserId 变为 WHERE 1231=1231 — 这始终为真。

因此,在原始存储过程中,MySQL 采用 if 语句的 else 分支,然后更新所有 记录——除非表是最初是空的,这是它采用 then 分支的唯一情况。我认为这与您分别看到 165 行和 1 行受影响的情况有关?

在新的存储过程中,碰巧每个列引用都是明确的——所以这不再是你的问题。根据定义,INSERT ... ON DUPLICATE KEY UPDATE (使用单个 VALUES 子句)只插入一行或更新一行:因此受影响的实际行数永远不会超过 1。但是,向调用应用程序指示是否插入或更新了一行,MySQL 重载了“行已更新”响应的含义:

With ON DUPLICATE KEY UPDATE, the affected-rows value per row is 1 if the row is inserted as a new row, and 2 if an existing row is updated.

关于mysql - 在 MySql Workbench 6.2 中调用 MySQL 存储过程时,影响 2 行而不是 1 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27689441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com