Kesalahan sintaksis karena menggunakan kata yang dipesan sebagai nama tabel atau kolom di MySQL

May 03 2014

Saya mencoba menjalankan kueri MySQL sederhana seperti di bawah ini:

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

Tapi saya mendapatkan kesalahan berikut:

ERROR 1064 (42000): Anda memiliki kesalahan dalam sintaks SQL; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang benar untuk digunakan 'key) VALUES ('Tim', 'Florida', 42)'di dekat baris 1

Bagaimana cara memperbaiki masalah tersebut?

Jawaban

294 AmalMurali May 03 2014 at 22:29

#Masalah

Dalam MySQL, kata-kata tertentu seperti SELECT, INSERT, DELETEdll adalah kata-kata dicadangkan. Karena mereka memiliki arti khusus, MySQL memperlakukannya sebagai kesalahan sintaks setiap kali Anda menggunakannya sebagai nama tabel, nama kolom, atau jenis pengenal lainnya - kecuali Anda mengapit pengenal dengan backticks.

Seperti disebutkan dalam dokumen resmi, di bagian 10.2 Nama Objek Skema (penekanan ditambahkan):

Objek tertentu dalam MySQL, termasuk database, tabel, indeks, kolom, alias, tampilan, prosedur tersimpan, partisi, tablespace, dan nama objek lainnya dikenal sebagai pengidentifikasi .

...

Jika pengenal berisi karakter khusus atau kata yang dipesan , Anda harus mengutipnya setiap kali Anda merujuknya.

...

Karakter kutipan pengenal adalah backtick (" `"):

Daftar lengkap kata kunci dan kata cadangan dapat ditemukan di bagian 10.3 Kata Kunci dan Kata Cadangan . Di halaman itu, kata-kata yang diikuti dengan "(R)" adalah kata yang dipesan. Beberapa kata khusus dicantumkan di bawah, termasuk banyak kata yang cenderung menyebabkan masalah ini.

  • MENAMBAHKAN
  • DAN
  • SEBELUM
  • OLEH
  • PANGGILAN
  • KASUS
  • KONDISI
  • MENGHAPUS
  • DESC
  • MENGGAMBARKAN
  • DARI
  • KELOMPOK
  • DI
  • INDEKS
  • MEMASUKKAN
  • SELANG
  • ADALAH
  • KUNCI
  • SUKA
  • MEMBATASI
  • PANJANG
  • PERTANDINGAN
  • TIDAK
  • PILIHAN
  • ATAU
  • MEMESAN
  • PARTISI
  • REFERENSI
  • PILIH
  • MEJA
  • UNTUK
  • MEMPERBARUI
  • DIMANA

#Solusinya

Anda punya dua pilihan.

1. Jangan gunakan kata-kata khusus sebagai pengenal

Solusi paling sederhana adalah dengan menghindari penggunaan kata-kata khusus sebagai pengenal. Anda mungkin dapat menemukan nama lain yang masuk akal untuk kolom Anda yang bukan merupakan kata khusus.

Melakukan ini memiliki beberapa keuntungan:

  • Ini menghilangkan kemungkinan bahwa Anda atau pengembang lain yang menggunakan database Anda secara tidak sengaja akan menulis kesalahan sintaks karena lupa - atau tidak mengetahui - bahwa pengenal tertentu adalah kata yang dipesan. Ada banyak kata khusus di MySQL dan sebagian besar pengembang tidak mungkin mengetahui semuanya. Dengan tidak menggunakan kata-kata ini sejak awal, Anda menghindari meninggalkan jebakan untuk diri sendiri atau pengembang masa depan.

  • Cara mengutip pengenal berbeda antara dialek SQL. Sementara MySQL menggunakan backticks untuk mengutip pengenal secara default, SQL yang memenuhi ANSI (dan memang MySQL dalam mode ANSI SQL, seperti yang disebutkan di sini ) menggunakan tanda kutip ganda untuk mengutip pengenal. Dengan demikian, kueri yang mengutip pengidentifikasi dengan backticks kurang mudah dibawa ke dialek SQL lainnya.

Demi mengurangi risiko kesalahan di masa mendatang, ini biasanya merupakan tindakan yang lebih bijak daripada mengutip pengenal dengan backtick.

2. Gunakan backticks

Jika mengganti nama tabel atau kolom tidak memungkinkan, bungkus pengidentifikasi yang menyinggung di backticks ( `) seperti yang dijelaskan dalam kutipan sebelumnya dari 10.2 Nama Objek Skema .

Contoh untuk mendemonstrasikan penggunaan (diambil dari 10.3 Kata Kunci dan Kata Cadangan ):

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)

Demikian pula, kueri dari pertanyaan dapat diperbaiki dengan membungkus kata kunci keydi backticks, seperti yang ditunjukkan di bawah ini:

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