2017-06-07 10 views
1

それは本当に問題ではないですが、私はすでに答えに苦労して見つけました。 問題は、次のクエリにあります。代わりのマイナス持つMySQLの「 - 」など、さまざまな

delete from <table> where id - 145; 

がはっきりタイプミスだっ等しいです。データベースの自動コミットがオンになり、id = 145のものを除いてテーブル内のすべてのエントリが削除されてしまいました。そこで、マイナスが "等しくない"演算子として機能しました。

私は似たような状況のために検索し、MySQLのドキュメントにこの演算子のために見て、私は何かを見つけることができませんでした。

が、これは、このように起こることになっていますか?それは正常かMySQLのバグですか?

答えて

3
delete from <table> where id - 145; 

id146-145=1と0のための1のための真と偽MySQLのリターンとして146であれば正常に動作します。

・ホープこれはあなたの疑問を解決します。

+0

これは、 'から削除することを意味します。

真:; となり、すべての値が削除されます。なぜid = 145のエントリが削除されなかったのですか? –

+1

145-145 = 0と0は偽です –

+0

うん、はい。今は理にかなっている。大いに感謝する。 –

2

これは一種の、正常です。 id - 145は、idが145でなく、where句のようなブール値コンテキストでは0以外の値がtrueと評価されたときに非ゼロに評価されます。

0

は、基本的にはゼロ以外の値がtrueと同等になりますselect * from mytable where 3;

を試してみてください。これは多くの言語でも当てはまります。文字列のコピーに使用される

while (*p++ = *q++);という驚異で私は何度も前にこの現象を見つけました。予想通り

3

これは完璧です。

は、以下のクエリを考えてみましょう:

delete from <table>; 
delete from <table> where true; 
delete from <table> where 1; 

あなたがこれらに従うならば、あなたは、任意の数がtruthyと見なされていない0ということを理解することができます。 0は虚偽とみなされます。したがって、また:

delete from <table> where 3; 
delete from <table> where 50; 
delete from <table> where -1; 

これらのクエリはすべて表のすべてを削除します。

今質問では、id - 145でした。これは、ID 145を持つ行を除いて、行ごとに非ゼロを返しますという理由だけで145から145 =なぜすべてがID 145

2

で行を除いて削除してしまっている0

その上のマイナスは「等しくない」演算子として作用した。

多かれ少なかれ。それは文字列に対しても同じ動作をしません。

WHERE句の内容は条件です。documentation of DELETEは、次のように説明しています。

where_conditionは、削除する各行に対してtrueと評価される式です。これは、Section 13.2.9, "SELECT Syntax"に記載されているように指定されます。

リンクされたページは言う:WHERE表現で

を、あなたは集約(要約)関数を除き、MySQLがサポートしている関数と演算子のいずれかを使用することができます。 Section 9.5, "Expression Syntax"およびChapter 12, Functions and Operatorsを参照してください。

id - 145は有効な数値式です。さまざまな(整数)数値に評価されます。
WHEREの条件として使用すると、その値はbooleanに変換されます。

セクション12.3.3 Logical Operatorsは言う:

MySQLはTRUEにゼロ以外の任意の、非NULL値を評価します。 id != 145を持つすべての行については

、表現id - 145は、あなたの質問に答えるために(WHERE条件FEでの)論理的な観点でTRUEとして扱われ、非ゼロ、非NULL整数

に評価されます。はい、それはこのように起こるはずです。これはMySQLのバグではなく、クエリのバグです(このようにしたい場合は入力ミス)。

+0

これはタイプミスでした。私は 'where id = 145'と書いていました。ありがとうございました。 –

関連する問題