ฉันจะหลีกเลี่ยงคำที่สงวนไว้ซึ่งใช้เป็นชื่อคอลัมน์ได้อย่างไร MySQL / สร้างตาราง


139

ฉันกำลังสร้างตารางจากคลาสใน. NET และปัญหาหนึ่งคือคลาสอาจมีชื่อฟิลด์keyซึ่งเป็นคำหลัก MySQL ที่สงวนไว้ ฉันจะหนีมันไปในคำสั่งสร้างตารางได้อย่างไร (หมายเหตุ: ปัญหาอื่น ๆ ด้านล่างคือข้อความจะต้องมีขนาดคงที่เพื่อจัดทำดัชนี / ไม่ซ้ำกัน)

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;

คำตอบ:


184

คุณสามารถใช้เครื่องหมายคำพูดคู่หากเปิดใช้งานโหมด ANSI SQL

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; 

หรือเห็บหลังที่เป็นกรรมสิทธิ์หนีออกมาเป็นอย่างอื่น ( คำตอบนี้จะหาตำแหน่ง`ตัวละครในรูปแบบแป้นพิมพ์แบบต่างๆได้อย่างไร)

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; 

(ที่มา: คู่มืออ้างอิง MySQL, 9.3 คำสงวน )


5
IMHO คุณควรอ้างอิงชื่อฟิลด์และชื่อตารางทั้งหมดเสมอ
rjmunro

10
@rjmunro - การทำเช่นนี้ค่อนข้างเป็นการป้องกันมากกว่าเพราะช่วยปกป้องคุณจากคำหลักที่สงวนไว้ใหม่ซึ่งถูกนำมาใช้ในเวอร์ชันต่อมา แต่ฉันไม่ชอบความยุ่งเหยิงทางภาพ
Martin Smith

การแก้ไขเดียวกัน (อัญประกาศคู่เพื่อหลบหนี) ทำงานกับคำหลักใน CQL ของ Cassandra เช่นกัน ฉันรู้หัวข้อเล็กน้อย แต่กระทู้นี้โผล่ขึ้นมาในการค้นหาเฉพาะของคาสซานดรา
Godfrey Duke

ลิงก์คู่มืออ้างอิง MySQL ไม่สามารถใช้งานได้ในตอนนี้ ลิงก์จริง: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

71

คุณควรใช้อักขระขีดหลัง (`) เช่น:

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

หากคุณสนใจในการพกพาระหว่างเซิร์ฟเวอร์ SQL ที่แตกต่างกันคุณควรใช้แบบสอบถาม ANSI SQL การหลีกเลี่ยงสตริงใน ANSI SQL ทำได้โดยใช้เครื่องหมายคำพูดคู่ (") โชคไม่ดีที่วิธีการหลบหลีกนี้ไม่สามารถพกพาไปยัง MySQL ได้เว้นแต่ว่ามันจะถูกตั้งค่าในโหมดความเข้ากันได้ของ ANSI

โดยส่วนตัวแล้วฉันเริ่มเซิร์ฟเวอร์ MySQL ด้วยอาร์กิวเมนต์ --sql-mode = 'ANSI' เพราะจะทำให้ทั้งสองวิธีหนีออกมาได้ หากคุณกำลังเขียนแบบสอบถามที่จะถูกดำเนินการในเซิร์ฟเวอร์ MySQL ที่ไม่ได้ติดตั้ง / ถูกควบคุมโดยคุณนี่คือสิ่งที่คุณสามารถทำได้:

  • เขียนแบบสอบถาม SQL ทั้งหมดที่คุณใช้ใน ANSI SQL
  • ใส่คำเหล่านี้ไว้ในข้อความค้นหาเฉพาะ MySQL ต่อไปนี้:

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

วิธีนี้เฉพาะคิวรี MySQL เฉพาะที่จุดเริ่มต้นและจุดสิ้นสุดของสคริปต์. sql ของคุณ หากคุณต้องการส่งสินค้าไปยังเซิร์ฟเวอร์อื่นให้ลบแบบสอบถาม 3 รายการนี้ออกและคุณพร้อมแล้ว สะดวกยิ่งขึ้นคุณสามารถสร้างสคริปต์ชื่อ: script_mysql.sql ที่จะมีคำสั่งการตั้งค่าโหมดข้างต้นแหล่งสคริปต์ script_ansi.sql และรีเซ็ตโหมด


มันเยี่ยมมาก! ฉันสามารถเขียนแบบสอบถามครั้งเดียวและใส่สวิตช์สำหรับ MySQL กอง!
ravemir
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.