2016-12-30 94 views
2

我创建一个存储过程来更新基于记录ID的表记录。这里是我的代码(在更新部分的值是硬编码只是为了测试):MySQL错误代码1175当试图更新存储过程内

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); 

我收到以下错误:

Error Code: 1175. You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column To disable safe mode, toggle the option in Preferences -> SQL Editor and reconnect.

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

我试过禁用SQL_SAFE_UPDATES,但是当我运行存储过程时,它更新了我所有的表记录!就好像,事实上,我没有使用主键的where子句。

任何想法?

回答

2

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

但是,该过程里面,目标ID被认为,是一个在paremeter,让您的查询其实是这样的:

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

至极相同做其中true的,所以它会更新所有的行。

+0

感谢您的回答,那就是问题所在。 –

+0

没有干草! Upvote如果你喜欢它;) – sdsc81

+0

当然,我已upvoted它,但可惜我没有名誉,所以它不包括u.u –

1

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

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; 

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

+0

谢谢你正是这个问题,我知道noob错误:P –