MySQL 構文エラー: 予約語をテーブル名または列名として使用することによって引き起こされる問題
P粉937769356
2023-08-21 20:17:23
<p>次の単純な MySQL クエリを実行しようとしています: </p>
<pre class="brush:sql;toolbar:false;">INSERT INTO user_details (ユーザー名、場所、キー)
値 ('ティム'、'フロリダ'、42)
</pre>
<p>しかし、次のエラーが発生します: </p>
<ブロック引用>
<p>ERROR 1064 (42000): SQL 構文にエラーがあります。<code>key) 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。VALUES ('Tim', ' Florida', 42)'</code> 行 1</p>
</blockquote>
<p>この問題を解決するにはどうすればよいですか? </p>
###質問###
MySQL では、
SELECT、
公式ドキュメントのセクション
INSERT
、DELETE
などの特定の単語は予約語です。これらには特別な意味があるため、これらをテーブル名、カラム名、またはその他のタイプの識別子として使用すると、識別子をバッククォートで囲まない限り、MySQL は構文エラーとして処理します。10.2 スキーマ オブジェクト名 (強調追加): キーワードと予約語の完全なリストは、セクション
10.3 キーワードと予約語 にあります。このページ内で「(R)」が付いている単語は予約語です。この問題を引き起こす可能性のある多くの予約語を含め、いくつかの予約語を以下に示します。 ###追加### ###そして### ###前に### ###による### ###電話### ###場合### ###状態### ###消去###
説明###説明する### ###から### ###グループ### ###で### ###索引### ###入れる### ###間隔### ###は### ###鍵### ###のように###- 制限
###長さ###
###マッチ###
###ない###
###オプション###
###または###
###注文###
###パーティション###
- ランク
- 参考文献
###選択する###
###テーブル###
###に###
###アップデート###
###どこ###
-
###解決###
選択肢は 2 つあります。 -
1. 予約語を識別子として使用しないでください-
最も簡単な解決策は、予約語を識別子として使用しないことです。予約語ではない別の適切な列名が見つかる可能性があります。 -
これにはいくつかの利点があります: -
- これにより、データベースを操作するあなたや他の開発者が、特定の識別子が予約語であることを忘れたり知らなかったりしたために、誤って構文エラーを書き込む可能性が排除されます。 MySQL には多くの予約語があり、ほとんどの開発者がそれらをすべて知っているとは考えられません。最初からこれらの単語を使用しないことで、自分自身や将来の開発者に罠を仕掛けるのを避けることができます。
-
- 識別子の引用方法は SQL 言語によって異なります。 MySQL はデフォルトで識別子を引用符で囲むのにバッククォーテーションを使用しますが、ANSI 準拠の SQL (および
- here
で説明されている ANSI SQL モードの MySQL) は識別子を引用符で囲むのに二重引用符を使用します。したがって、バックティックを使用して識別子を引用するクエリは、他の SQL 言語への移植性が低くなります。 -
-
将来のエラーのリスクを軽減するには、多くの場合、識別子をバッククォートで引用するよりも賢明です。 -
2.バッククォートを使用する-
テーブルまたは列の名前を変更できない場合は、前述の - 10.2 スキーマ オブジェクト名
- で説明されているように、テーブルまたは列をバッククォート (
- `
) で囲みます。 -
次に、使用法を示す例を示します (- 10.3 キーワードと予約語
から抜粋): -
- 同様に、質問内のクエリは、次のようにキー
key- をバッククォートで囲むことで修正できます。
リーリー