Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lỗi cú pháp do sử dụng từ dành riêng làm tên bảng hoặc cột trong MySQL

Vấn đề

Trong MySQL, một số từ nhất định như SELECT , INSERT , DELETE v.v ... là những từ dành riêng. Vì chúng có ý nghĩa đặc biệt, MySQL coi nó như một lỗi cú pháp bất cứ khi nào bạn sử dụng chúng làm tên bảng, tên cột hoặc loại số nhận dạng khác - trừ khi bạn bao quanh số nhận dạng bằng các dấu gạch ngược.

Như đã lưu ý trong tài liệu chính thức, trong phần 10.2 Tên đối tượng giản đồ (nhấn mạnh thêm):

Các đối tượng nhất định trong MySQL, bao gồm cơ sở dữ liệu, bảng, chỉ mục, cột, bí danh, chế độ xem, thủ tục được lưu trữ, phân vùng, vùng bảng và các tên đối tượng khác được gọi là mã định danh .

...

Nếu số nhận dạng chứa các ký tự đặc biệt hoặc là từ dành riêng , bạn phải trích dẫn nó bất cứ khi nào bạn tham khảo nó.

...

Ký tự trích dẫn của mã định danh là biểu tượng nền ("` "):

Bạn có thể tìm thấy danh sách đầy đủ các từ khóa và từ dành riêng trong phần 10.3 Từ khóa và Các từ dành riêng . Trong trang đó, các từ được theo sau bởi "(R)" là các từ dành riêng. Một số từ dành riêng được liệt kê bên dưới, bao gồm nhiều từ có xu hướng gây ra vấn đề này.

  • THÊM
  • TRƯỚC HẠN
  • BỞI
  • CALL
  • TRƯỜNG HỢP
  • ĐIỀU KIỆN
  • XÓA
  • DESC
  • MÔ TẢ
  • TỪ
  • NHÓM
  • TRONG
  • INDEX
  • CHÈN
  • INTERVAL
  • KEY
  • THÍCH
  • LIMIT
  • DÀI
  • TRẬN ĐẤU
  • KHÔNG
  • TÙY CHỌN
  • HOẶC
  • ĐẶT HÀNG
  • PHẦN THƯỞNG
  • RANK
  • TÀI LIỆU THAM KHẢO
  • CHỌN
  • BẢNG HIỆU
  • ĐẾN
  • CẬP NHẬT
  • WHERE

Giải pháp

Bạn có hai lựa chọn.

1. Không sử dụng các từ dành riêng làm định danh

Giải pháp đơn giản nhất là tránh sử dụng các từ dành riêng làm định danh. Bạn có thể tìm thấy một tên hợp lý khác cho cột của mình mà không phải là một từ dành riêng.

Làm điều này có một số lợi thế:

  • Nó loại bỏ khả năng bạn hoặc một nhà phát triển khác sử dụng cơ sở dữ liệu của bạn sẽ vô tình viết lỗi cú pháp do quên - hoặc không biết - rằng một số nhận dạng cụ thể là một từ dành riêng. Có rất nhiều từ dành riêng trong MySQL và hầu hết các nhà phát triển khó có thể biết tất cả chúng. Bằng cách không sử dụng những từ này ngay từ đầu, bạn tránh để lại bẫy cho chính mình hoặc các nhà phát triển trong tương lai.

  • Các phương tiện trích dẫn số nhận dạng khác nhau giữa các phương ngữ SQL. Mặc dù MySQL sử dụng backticks để trích dẫn số nhận dạng theo mặc định, SQL tuân thủ ANSI (và thực sự là MySQL ở chế độ ANSI SQL, như đã lưu ý tại đây ) sử dụng dấu ngoặc kép để trích dẫn số nhận dạng. Do đó, các truy vấn trích dẫn số nhận dạng có dấu gạch ngược ít dễ di chuyển hơn đối với các phương ngữ SQL khác.

Hoàn toàn vì lợi ích của việc giảm nguy cơ mắc sai lầm trong tương lai, đây thường là một hướng hành động khôn ngoan hơn là trích dẫn mã định danh ngược.

2. Sử dụng dấu nền

Nếu không thể đổi tên bảng hoặc cột, hãy bọc mã nhận dạng vi phạm trong dấu gạch ngược (` ) như được mô tả trong trích dẫn trước đó từ 10.2 Tên đối tượng lược đồ .

Một ví dụ để chứng minh cách sử dụng (được lấy từ 10.3 Từ khóa và Từ dành riêng ):

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)

Tương tự, truy vấn từ câu hỏi có thể được sửa bằng cách gói từ khóa key trong backticks, như được hiển thị bên dưới:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL IFNULL () Giải thích

  2. Làm cách nào tôi có thể thực hiện so sánh chuỗi phân biệt chữ hoa chữ thường SQL trên MySQL?

  3. Năm ứng dụng phần mềm hàng đầu để truy cập máy chủ MySQL / MariaDB

  4. Sửa lỗi Quyền truy cập bị từ chối cho người dùng 'root' @ 'localhost' cho phpMyAdmin

  5. Laravel Eloquent so với trình tạo truy vấn - Tại sao sử dụng eloquent để giảm hiệu suất