[解決済み] MySQLで予約語をテーブル名またはカラム名として使用したことによるシンタックスエラー
質問
私は以下のような簡単な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)"; ^ ^
関連
-
[解決済み】1052:フィールドリストの列「id」が曖昧である
-
[解決済み] MySQL エラー 1093 - FROM 句で更新のターゲット テーブルを指定できません。
-
[解決済み] SQLキー、MUL vs PRI vs UNI
-
[解決済み] mysql サーバーがクラッシュした -mysqld got signal 6
-
[解決済み] MySQLで特定のカラムの後に複数のカラムを追加する
-
[解決済み] MySQLでカラム名を変更する
-
[解決済み】MySQLで2つの値の最大値を取得する方法は?
-
[解決済み】VARCHARからINTへのキャスト - MySQL
-
[解決済み】MySQLのテーブルから制約を削除する方法は?
-
[解決済み】カラムを変更し、デフォルト値を変更する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】SQLSTATE[42000]: 構文エラーまたはアクセス違反が発生しました。1064 SQL 構文にエラーがあります - PHP - PDO [重複]。
-
[解決済み】MySQLエラー#1071 - 指定されたキーが長すぎる; キーの最大長は767バイトです。
-
[解決済み】SQL ZOO 各大陸とアルファベット順で1位の国名をリストアップする
-
[解決済み】MySQL 派生テーブルはすべて独自のエイリアスを持つ必要があります。
-
[解決済み] mysql.pluginテーブルを開くことができません。mysql_upgradeを実行し、作成してください。
-
[解決済み] MySQL エラー: キーの長さがないキー指定
-
[解決済み] MySql テーブル、エラー#1064 & エラー#1068 複数の主キーが定義されている [終了] 。
-
[解決済み] MySQLを使用したパーセンタイル値の計算
-
[解決済み] MySQL エラー 1241。オペランドには1つのカラムが含まれている必要があります。
-
[解決済み] Mysql: const テーブルを読み込んだ後、不可能な場所に気づいた。