1. ホーム
  2. mysql

[解決済み] MySQLで予約語をテーブル名またはカラム名として使用したことによるシンタックスエラー

2022-03-09 09:46:38

質問

私は以下のような簡単なMySQLクエリを実行しようとしています。

INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)

しかし、次のようなエラーが発生します。

エラー 1064 (42000)。MySQLサーバーのバージョンに対応するマニュアルをチェックして、正しい構文を使用してください。 'key) VALUES ('Tim', 'Florida', 42)' 1行目

どうすればこの問題を解決できますか?

どのように解決するのですか?

問題点

MySQLでは、以下のような特定の単語が SELECT , INSERT , DELETE などは予約語です。これらは特別な意味を持つため、テーブル名、カラム名、またはその他の種類の識別子としてこれらを使用した場合、MySQLはシンタックスエラーとして扱います(識別子をバックティックで囲んでいる場合を除く)。

公式ドキュメントにあるように、セクション 10.2 スキーマオブジェクト名 (強調)である。

データベース、テーブル、インデックス、カラム、エイリアス、ビュー、ストアドプロシージャ、パーティション、テーブルスペースなど、MySQL内の特定のオブジェクトの名称は 識別子 .

...

識別子に特殊文字が含まれている場合や 予約語 , you なければならない を引用してください。

...

識別子である引用符は バックトニック (" ` ")。

キーワードと予約語の完全なリストは、以下のセクションで見ることができます。 10.3 キーワードと予約語 . そのページで、"(R)" が続く単語は予約語です。予約語の一部を以下に示しますが、この問題を起こしやすいものも多く含まれています。

  • アドレス
  • AND
  • バイ
  • コール
  • CASE
  • 条件
  • デリート
  • DESC
  • DESCRIBE
  • フロム
  • グループ
  • IN
  • INDEX(インデックス
  • INSERT
  • インターバル
  • IS
  • キー
  • LIKE
  • 制限
  • ロング
  • マッチ
  • NOT
  • オプション
  • OR
  • ORDER
  • パーティション
  • ランク
  • 参考文献
  • セレクト
  • テーブル
  • を行う。
  • アップデイト
  • WHERE

解決策

選択肢は2つです。

1. 予約語を識別子として使用しない

最も簡単な方法は、予約語を識別子として使用しないことです。予約語ではない別の適切なカラム名を見つけることができるかもしれません。

この方法には、いくつかの利点があります。

  • データベースを使用する開発者が、ある識別子が予約語であることを忘れたり、知らなかったりして、誤って構文エラーを書き込む可能性を排除することができるのです。MySQL には多くの予約語があり、ほとんどの開発者はそのすべてを知っていることはないでしょう。これらの単語を最初に使用しないことで、自分自身や将来の開発者のために罠を残すことを避けることができます。

  • 識別子のクォート方法は、SQL方言によって異なります。MySQL はデフォルトで識別子のクォートにバックティックを使用しますが、ANSI 準拠の SQL(そして実際に ANSI SQL モードの MySQL は、前述のように ここで ) は二重引用符で囲みます。そのため、識別子をバッククォートで引用するクエリは、他のSQL方言に簡単に移植することができません。

純粋に、将来的なミスのリスクを減らすために、識別子をバッククォートするよりも、通常はこの方が賢明な行動と言えます。

2. バックテックの使用

テーブルやカラムの名前を変更できない場合は、問題のある識別子をバックスティックで囲みます ( ` の引用で説明したように 10.2 スキーマオブジェクト名 .

使い方を説明する例です。 10.3 キーワードと予約語 ):

mysql> CREATE TABLE interval (begin INT, end INT);
ERROR 1064 (42000): You have an error in your SQL syntax.
near 'interval (begin INT, end INT)'

mysql> CREATE TABLE `interval` (begin INT, end INT); Query OK, 0 rows affected (0.01 sec)

同様に、質問からのクエリは、キーワードをラップすることで修正できます key のように、バックティックで囲んでいます。

INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)";               ^   ^