Làm cách nào để thoát các từ dành riêng được sử dụng làm tên cột? Bảng MySQL / Tạo


139

Tôi đang tạo các bảng từ các lớp trong .NET và một vấn đề là một lớp có thể có một tên trường keylà một từ khóa MySQL dành riêng. Làm thế nào để tôi thoát nó trong một tuyên bố tạo bảng? (Lưu ý: Vấn đề khác bên dưới là văn bản phải có kích thước cố định để được lập chỉ mục / duy nhất)

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;

Câu trả lời:


184

Bạn có thể sử dụng dấu ngoặc kép nếu chế độ ANSI SQL được bật

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; 

hoặc đánh dấu độc quyền trở lại thoát khác. (Nơi tìm `ký tự trên các bố cục bàn phím khác nhau được đề cập trong câu trả lời này )

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; 

(Nguồn: Hướng dẫn tham khảo MySQL, 9.3 dành riêng )


5
IMHO bạn nên trích dẫn tất cả các tên trường và tên bảng luôn.
rjmunro

10
@rjmunro - Làm như vậy có phần phòng thủ hơn vì nó bảo vệ bạn trước các từ khóa dành riêng mới được giới thiệu trong các phiên bản sau nhưng tôi không thích sự lộn xộn thị giác.
Martin Smith

Cách khắc phục tương tự (trích dẫn kép để thoát) cũng hoạt động cho các từ khóa trong CQL của Cassandra. Một chút lạc đề, tôi biết, nhưng chủ đề này nổi lên trong một tìm kiếm cụ thể của Cassandra.
Công tước Godfrey

Liên kết hướng dẫn tham khảo MySQL bị hỏng ngay bây giờ. Liên kết thực tế: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

70

Bạn nên sử dụng ký tự đánh dấu lại (`), vd:

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;

15

Nếu bạn quan tâm đến tính di động giữa các máy chủ SQL khác nhau, bạn nên sử dụng các truy vấn SQL ANSI. Chuỗi thoát trong ANSI SQL được thực hiện bằng cách sử dụng dấu ngoặc kép ("). Thật không may, phương thức thoát này không thể di chuyển tới MySQL, trừ khi nó được đặt trong chế độ tương thích ANSI.

Cá nhân, tôi luôn khởi động máy chủ MySQL của mình bằng đối số --sql-mode = 'ANSI' vì điều này cho phép cả hai phương thức thoát. Nếu bạn đang viết các truy vấn sẽ được thực thi trong máy chủ MySQL không được thiết lập / được kiểm soát bởi bạn, đây là những gì bạn có thể làm:

  • Viết tất cả các truy vấn SQL của bạn trong ANSI SQL
  • Gửi chúng trong các truy vấn cụ thể của MySQL sau đây:

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

Bằng cách này, các truy vấn cụ thể của MySQL là ở đầu và cuối tập lệnh .sql của bạn. Nếu bạn muốn gửi chúng cho một máy chủ khác, chỉ cần xóa 3 truy vấn này và bạn đã hoàn tất. Thậm chí thuận tiện hơn, bạn có thể tạo một tập lệnh có tên: script_mysql.sql có thể chứa các truy vấn cài đặt chế độ ở trên, lấy tập lệnh script_ansi.sql và đặt lại chế độ.


Điều đó thật tuyệt! Tôi có thể viết truy vấn một lần và chỉ cần đặt một chuyển đổi cho ngăn xếp MySQL!
ravemir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.