web-dev-qa-db-ja.com

列名として使用される予約語をエスケープするにはどうすればよいですか? MySQL /テーブルの作成

.NETのクラスからテーブルを生成していますが、1つの問題は、MySQLの予約キーワードであるフィールド名keyを持つ可能性があることです。 create tableステートメントでエスケープするにはどうすればよいですか? (注:以下のその他の問題は、テキストをインデックス/一意にするために固定サイズにする必要があることです)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;
132
user34537

ANSI SQLモード が有効な場合、二重引用符を使用できます

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

それ以外の場合は、独自のバックティックがエスケープされます。 (さまざまなキーボードレイアウトで`文字を見つける場所は この回答 で説明されています)

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(出典: MySQLリファレンスマニュアル、9.3予約語

169
Martin Smith

バックティック文字( `)を使用する必要があります。例:

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;
69
Web Logic

異なるSQLサーバー間の移植性に関心がある場合は、ANSI SQLクエリを使用する必要があります。 ANSI SQLでの文字列エスケープは、二重引用符( ")を使用して行われます。残念ながら、このエスケープメソッドは、ANSI互換モードで設定されていない限り、MySQLに移植できません。

個人的に、私は常に--sql-mode = 'ANSI'引数でMySQLサーバーを起動します。これは両方のエスケープ方法を許可するためです。セットアップされていない/自分で制御されているMySQLサーバーで実行されるクエリを作成している場合、次のことができます。

  • すべてのSQLクエリをANSI SQLで記述します
  • 次のMySQL固有のクエリでそれらを囲みます。

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;
    

このように、MySQL固有のクエリは.sqlスクリプトの最初と最後にあります。別のサーバーにそれらを出荷する場合は、これらの3つのクエリを削除するだけで十分です。さらに便利なのは、上記のモード設定クエリを含むscript_mysql.sqlという名前のスクリプトを作成し、script_ansi.sqlスクリプトを取得してモードをリセットすることです。

15