尝试在存储过程中更新时出现 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 条目时出现“超过锁定等待超时”错误?