Bagaimana cara saya melepaskan kata-kata yang dicadangkan yang digunakan sebagai nama kolom? MySQL / Buat Tabel

139

Saya menghasilkan tabel dari kelas di .NET dan satu masalah adalah kelas mungkin memiliki nama bidang keyyang merupakan kata kunci MySQL yang dipesan. Bagaimana cara menghindarinya dalam membuat tabel pernyataan? (Catatan: Masalah lain di bawah ini adalah teks harus berukuran tetap untuk diindeks / unik)

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;
Jonathan Leffler
sumber

Jawaban:

184

Anda dapat menggunakan tanda kutip ganda jika mode ANSI SQL diaktifkan

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; 

atau tanda centang berpemilik yang lolos dari yang sebaliknya. (Di mana menemukan `karakter pada berbagai tata letak keyboard tercakup dalam jawaban ini )

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; 

(Sumber: Manual Referensi MySQL, 9.3 Kata-Kata Dilindungi )

Martin Smith
sumber
5
IMHO Anda harus mengutip semua nama bidang dan nama tabel selalu.
rjmunro
10
@ rjmunro - Melakukannya agak lebih defensif karena melindungi Anda terhadap kata kunci cadangan baru yang diperkenalkan di versi yang lebih baru, tetapi saya tidak suka kekacauan visual.
Martin Smith
Perbaikan yang sama (penawaran ganda untuk melarikan diri) juga berfungsi untuk kata kunci dalam Cassandra's CQL. Agak di luar topik, saya tahu, tetapi utas ini muncul dalam pencarian khusus Cassandra.
Godfrey Duke
Tautan Manual Referensi MySQL rusak untuk saat ini. Tautan aktual: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
70

Anda harus menggunakan karakter centang kembali (`) misalnya:

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;

sumber
15

Jika Anda tertarik pada portabilitas antara berbagai server SQL, Anda harus menggunakan kueri SQL ANSI. String melarikan diri dalam ANSI SQL dilakukan dengan menggunakan tanda kutip ganda ("). Sayangnya, metode melarikan diri ini tidak portabel untuk MySQL, kecuali jika diatur dalam mode kompatibilitas ANSI.

Secara pribadi, saya selalu memulai server MySQL saya dengan argumen --sql-mode = 'ANSI' karena ini memungkinkan kedua metode untuk melarikan diri. Jika Anda menulis kueri yang akan dieksekusi di server MySQL yang tidak disetel / dikendalikan oleh Anda, berikut ini yang dapat Anda lakukan:

  • Tulis semua pertanyaan SQL Anda dalam ANSI SQL
  • Lampirkan dalam permintaan khusus MySQL berikut:

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

Dengan cara ini, hanya kueri khusus MySQL yang ada di awal dan di akhir skrip .sql Anda. Jika Anda ingin mengirim mereka untuk server yang berbeda, cukup hapus 3 pertanyaan ini dan Anda siap. Bahkan lebih nyaman Anda dapat membuat skrip bernama: script_mysql.sql yang akan berisi permintaan pengaturan mode di atas, sumber skrip script_ansi.sql dan reset mode.

Charalampos Serenis
sumber
Ini bagus! Saya dapat menulis kueri sekali dan cukup meletakkan sakelar untuk tumpukan MySQL!
ravemir