Masalahnya
Di MySQL, kata-kata tertentu seperti SELECT
, INSERT
, DELETE
dll. adalah kata-kata yang dicadangkan. Karena memiliki arti khusus, MySQL memperlakukannya sebagai kesalahan sintaks setiap kali Anda menggunakannya sebagai nama tabel, nama kolom, atau jenis pengenal lainnya - kecuali jika Anda mengapit pengenal dengan tanda centang.
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 merupakan kata khusus , 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 oleh "(R)" adalah kata-kata yang dicadangkan. Beberapa kata yang dicadangkan tercantum di bawah ini, termasuk banyak yang cenderung menyebabkan masalah ini.
- TAMBAHKAN
- DAN
- SEBELUM
- OLEH
- HUBUNGI
- KASUS
- SYARAT
- HAPUS
- DESC
- MENJELASKAN
- DARI
- GROUP
- MASUK
- INDEX
- MASUKKAN
- INTERVAL
- ADALAH
- KUNCI
- SUKA
- BATAS
- PANJANG
- PERTANDINGAN
- TIDAK
- OPSI
- ATAU
- PESAN
- PARTISI
- RANK
- REFERENSI
- PILIH
- TABEL
- KEPADA
- PERBARUI
- DIMANA
Solusinya
Anda memiliki dua opsi.
1. Jangan gunakan kata-kata yang dicadangkan sebagai pengidentifikasi
Solusi paling sederhana adalah menghindari penggunaan kata-kata yang dicadangkan sebagai pengidentifikasi. 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 akan secara tidak sengaja menulis kesalahan sintaks karena lupa - atau tidak mengetahui - bahwa pengidentifikasi tertentu adalah kata yang dicadangkan. Ada banyak kata yang dicadangkan 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 pengidentifikasi secara default, SQL yang sesuai dengan ANSI (dan memang MySQL dalam mode ANSI SQL, seperti yang dicatat di sini ) menggunakan tanda kutip ganda untuk mengutip pengidentifikasi. Dengan demikian, kueri yang mengutip pengidentifikasi dengan backticks kurang mudah dibawa-bawa ke dialek SQL lainnya.
Murni demi mengurangi risiko kesalahan di masa mendatang, ini biasanya merupakan tindakan yang lebih bijaksana daripada mengutip tanda pengenal.
2. Gunakan backtick
Jika mengganti nama tabel atau kolom tidak memungkinkan, bungkus pengidentifikasi yang melanggar 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 key
di backticks, seperti yang ditunjukkan di bawah ini:
INSERT INTO user_details (username, location, `key`)
VALUES ('Tim', 'Florida', 42)"; ^ ^