2016-12-30 6 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という名前のテーブル内の列が見つかるため、更新クエリが実行されます。

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

WICHは、真を行うのと同じである:あなたのクエリは、実際に似ているので

はしかし、プロシージャ内で、は、paremeterの1であると考えられているをdestination_IDのすべての行を更新します。

+0

あなたの答えをありがとう、それは問題でした。 –

+0

いいえ、干し草!あなたが好きならUpvote;) – sdsc81

+0

もちろん、私はそれをupvotedしているが、悲しいことに私はここで評判がないので、それはカウントされませんu.u –

1

ストアドプロシージャ内のパラメータに列とは異なる名前を付けます。私は、これはエラーを返します推測している:WHERE句の

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_idではなく(私は存在していない推測している)欄より、入力パラメータを参照することができます。

+0

私は知っているnoobの間違いとまったく同じ問題でした:P –

関連する問題