Saya cuba melaksanakan pertanyaan MySQL mudah seperti ini:
INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42)
Tetapi saya mendapat ralat berikut:
Ralat 1064 (42000): Anda mempunyai ralat dalam sintaks SQL anda; semak manual untuk versi pelayan MySQL anda untuk sintaks yang betul untuk digunakan berhampiran baris 1
'key) VALUES ('Tim', 'Florida', 42)'
Bagaimana untuk menyelesaikan masalah ini?
Soalan
Dalam MySQL, beberapa perkataan seperti
SELECT
、INSERT
、DELETE
adalah perkataan terpelihara. Oleh kerana ia mempunyai makna yang istimewa, MySQL menganggapnya sebagai ralat sintaks apabila anda menggunakannya sebagai nama jadual, nama lajur atau jenis pengecam lain - melainkan anda menyertakan pengecam dalam tanda belakang.Seperti yang dinyatakan dalam dokumentasi rasmi, dalam 10.2 nama objek skema em> (penekanan ditambah):
Senarai lengkap kata kunci dan perkataan terpelihara boleh didapati di bahagian 10.3 Kata Kunci dan Perkataan Terpelihara . Dalam halaman ini, perkataan yang diikuti dengan "(R)" adalah perkataan terpelihara. Beberapa perkataan terpelihara disenaraikan di bawah, termasuk banyak yang cenderung menyebabkan masalah ini.
Penyelesaian
Anda ada dua pilihan.
1. Jangan gunakan perkataan terpelihara sebagai pengecam
Penyelesaian paling mudah adalah dengan mengelak daripada menggunakan perkataan yang dikhaskan sebagai pengecam. Anda mungkin boleh mencari nama lain yang munasabah untuk lajur anda yang bukan perkataan simpanan.
Terdapat beberapa kelebihan untuk melakukan ini:
Ia menghapuskan kemungkinan anda atau pembangun lain bekerja dengan pangkalan data secara tidak sengaja menulis ralat sintaks kerana mereka terlupa atau tidak tahu bahawa pengecam tertentu ialah perkataan yang dikhaskan. Terdapat banyak perkataan terpelihara dalam MySQL, dan tidak mungkin kebanyakan pembangun mengetahui kesemuanya. Dengan tidak menggunakan perkataan ini pada mulanya, anda mengelak daripada membuat perangkap untuk diri sendiri atau pembangun masa depan.
Cara pengecam dipetik berbeza antara dialek SQL. Walaupun MySQL menggunakan tanda belakang untuk memetik pengecam secara lalai, SQL yang mematuhi ANSI (sebenarnya MySQL dalam mod ANSI SQL, seperti yang diterangkan di sini) ) menggunakan petikan berganda untuk memetik pengecam. Oleh itu, pertanyaan yang menggunakan tanda belakang untuk memetik pengecam kurang mudah alih kepada dialek SQL yang lain.
Semata-mata untuk mengurangkan risiko ralat masa hadapan, ini secara amnya merupakan pendekatan yang lebih bijak daripada pengecam tanda belakang.
2. Gunakan tanda belakang
Jika jadual atau lajur tidak boleh dinamakan semula, sertakan pengecam yang berkenaan dalam tanda belakang (
`
), seperti dalam 10.2 Nama Objek Skema yang dipetik sebelum ini.Contoh menunjukkan penggunaan (diambil daripada 10.3 Kata Kunci dan Perkataan Terpelihara):
Sekali lagi, pertanyaan dalam soalan boleh dibetulkan dengan membungkus kata kunci
key
dalam tanda belakang, seperti ini: