尝试在存储过程中更新时出现 MySQL 错误代码 1175

Posted

技术标签:

【中文标题】尝试在存储过程中更新时出现 MySQL 错误代码 1175【英文标题】:MySQL Error Code 1175 when trying to update inside stored procedure 【发布时间】:2017-05-15 01:46:22 【问题描述】:

我正在创建一个存储过程来根据记录 ID 更新表记录。这是我的代码(更新部分中的值是硬编码的,仅用于测试):

CREATE DEFINER=`root`@`localhost` PROCEDURE `destination_update`(
 IN destination_id char(3),
 IN destination_name varchar(250),
 IN is_office tinyint(1),
 IN address varchar(250),
 IN status_id int(11))

BEGIN
    UPDATE `paisanos_new`.`destinations`
    SET
    `destination_name` = 'b',
    `is_office` = 0,
    `address` = 'b',
    `status_id` = 2
    WHERE `destination_id` = 'zzz';

END

当我调用程序时:

call paisanos_new.destination_update('zzz', 'a', 0, 'a', 2);

我收到以下错误:

错误代码:1175。您正在使用安全更新模式,并且您尝试更新没有使用 KEY 列的 WHERE 的表 要禁用安全模式,请切换 Preferences -> SQL Editor 中的选项并重新连接。

但是,当我只执行更新查询时,它工作正常。

我尝试禁用 SQL_SAFE_UPDATES,但是当我运行存储过程时,它会更新我的所有表记录!就好像我确实没有带主键的 where 子句一样。

有什么想法吗?

【问题讨论】:

【参考方案1】:

当您只执行更新查询时,它会起作用,因为它会在名为 destination_id 的表中找到列。

但是,在过程中,考虑的 destination_id 是参数中的那个,所以您的查询实际上是这样的:

UPDATE ... WHERE 'zzz' = 'zzz';

Wich 与 WHERE true 相同,因此它会更新所有行。

【讨论】:

感谢您的回答,这就是问题所在。 当然我已经投了赞成票,但遗憾的是我在这里没有名声,所以它不算你.u【参考方案2】:

以不同于列的方式命名存储过程中的参数。我猜这会返回一个错误:

CREATE DEFINER=`root`@`localhost` PROCEDURE `destination_update`(
 IN in_destination_id char(3),
 IN in_destination_name varchar(250),
 IN in_is_office tinyint(1),
 IN in_address varchar(250),
 IN in_status_id int(11)
)
BEGIN
    UPDATE `paisanos_new`.`destinations` d
    SET `destination_name` = 'b',
         `is_office` = 0,
         `address` = 'b',
         `status_id` = 2
    WHERE d.`destination_id` = 'zzz';    
END;

也就是说,WHERE 子句中的destination_id 可能引用了输入参数,而不是列(我猜它不存在)。

【讨论】:

谢谢这正是问题所在,我知道菜鸟错误:P

以上是关于尝试在存储过程中更新时出现 MySQL 错误代码 1175的主要内容,如果未能解决你的问题,请参考以下文章

为啥在使用简单存储过程时出现 MySQL 错误 #1312?

为啥在尝试更新 MySQL 条目时出现“超过锁定等待超时”错误?

Mysql创建存储过程时出现ERROR 1064错误

尝试执行存储过程时出现意外错误

MySQL & MsAccess 2007 - 尝试更新时出现错误 3197

执行存储过程 NJS-012 时出现 node-oracledb 错误