2016-12-30 57 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 –