sql >> データベース >  >> RDS >> Mysql

MySQLで予約語をテーブル名または列名として使用したために構文エラーが発生しました

    問題

    MySQLでは、 SELECTのような特定の単語 、 INSERT DELETE などは予約語です。これらは特別な意味を持つため、MySQLは、テーブル名、列名、またはその他の種類の識別子として使用する場合は常に構文エラーとして扱います。ただし、識別子をバッククォートで囲む場合を除きます。

    公式ドキュメントに記載されているように、セクション10.2スキーマオブジェクト名> (強調を追加):

    データベース、テーブル、インデックス、列、エイリアス、ビュー、ストアドプロシージャ、パーティション、テーブルスペース、その他のオブジェクト名など、MySQL内の特定のオブジェクトは、識別子と呼ばれます。

    ...

    識別子に特殊文字が含まれている場合、または予約語である場合 必須 参照するときはいつでも引用してください。

    ...

    識別子の引用文字はバックティックです ("` "):

    キーワードと予約語の完全なリストは、セクション10.3キーワードと予約語 。そのページでは、「(R)」が続く単語は予約語です。この問題を引き起こす傾向のある多くの単語を含む、いくつかの予約語を以下に示します。

    • 追加
    • および
    • BY
    • 電話
    • ケース
    • 状態
    • 削除
    • DESC
    • 説明
    • FROM
    • グループ
    • IN
    • インデックス
    • 挿入
    • 間隔
    • IS
    • キー
    • いいね
    • 制限
    • 長い
    • 一致
    • しない
    • オプション
    • または
    • 注文
    • パーティション
    • ランク
    • 参考資料
    • SELECT
    • TO
    • 更新
    • 場所

    ソリューション

    2つのオプションがあります。

    1。予約語を識別子として使用しないでください

    最も簡単な解決策は、予約語を識別子として使用しないようにすることです。おそらく、予約語ではない別の適切な名前を列に見つけることができます。

    これを行うことにはいくつかの利点があります:

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

    • 識別子を引用する方法は、SQL方言によって異なります。 MySQLはデフォルトで識別子の引用にバックティックを使用しますが、ANSI準拠のSQL(および、ここ )識別子を引用するために二重引用符を使用します。そのため、バッククォートを使用して識別子を引用するクエリは、他の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)";               ^   ^
    



    1. ビッグデータの高速読み込み

    2. 単一のクエリ(再帰クエリ)でmysqlテーブル内のすべての親を検索する

    3. SQL ServerのOBJECTPROPERTY()を使用して、オブジェクトが主キーであるかどうかを確認します

    4. MariaDBでのSIN()のしくみ