Wie entkomme ich reservierten Wörtern, die als Spaltennamen verwendet werden? MySQL / Tabelle erstellen

139

Ich generiere Tabellen aus Klassen in .NET und ein Problem ist, dass eine Klasse möglicherweise einen Feldnamen hat, keyder ein reserviertes MySQL-Schlüsselwort ist. Wie kann ich es in einer create table-Anweisung umgehen? (Hinweis: Das andere Problem unten ist, dass Text eine feste Größe haben muss, um indiziert / eindeutig zu sein.)

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;
Jonathan Leffler
quelle

Antworten:

184

Sie können doppelte Anführungszeichen verwenden, wenn der ANSI-SQL-Modus aktiviert ist

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; 

oder das proprietäre Back-Tick entweicht anders. (Wo das `Zeichen auf verschiedenen Tastaturlayouts zu finden ist, wird in dieser Antwort behandelt. )

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; 

(Quelle: MySQL-Referenzhandbuch, 9.3 Reservierte Wörter )

Martin Smith
quelle
5
IMHO sollten Sie immer alle Feldnamen und Tabellennamen zitieren.
rjmunro
10
@rjmunro - Dies ist etwas defensiver, da es Sie vor neuen reservierten Schlüsselwörtern schützt, die in späteren Versionen eingeführt werden, aber ich mag die visuelle Unordnung nicht.
Martin Smith
Das gleiche Update (doppeltes Anführungszeichen, um zu entkommen) funktioniert auch für Schlüsselwörter in Cassandras CQL. Ich weiß, ein bisschen abseits des Themas, aber dieser Thread tauchte in einer Cassandra-spezifischen Suche auf.
Godfrey Duke
Der Link zum MySQL-Referenzhandbuch ist vorerst unterbrochen. Aktueller Link: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64
70

Sie sollten das Back-Tick-Zeichen (`) verwenden, z.

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;

quelle
15

Wenn Sie an der Portabilität zwischen verschiedenen SQL-Servern interessiert sind, sollten Sie ANSI-SQL-Abfragen verwenden. Das Escapezeichenfolgen in ANSI SQL erfolgt in doppelten Anführungszeichen ("). Leider ist diese Escapezeichenmethode nicht auf MySQL portierbar, es sei denn, sie ist im ANSI-Kompatibilitätsmodus festgelegt.

Persönlich starte ich meinen MySQL-Server immer mit dem Argument --sql-mode = 'ANSI', da dies beide Escape-Methoden ermöglicht. Wenn Sie Abfragen schreiben, die auf einem MySQL-Server ausgeführt werden sollen, der nicht von Ihnen eingerichtet wurde / wird, können Sie Folgendes tun:

  • Schreiben Sie alle Ihre SQL-Abfragen in ANSI SQL
  • Schließen Sie sie in die folgenden MySQL-spezifischen Abfragen ein:

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

Auf diese Weise befinden sich die einzigen MySQL-spezifischen Abfragen am Anfang und am Ende Ihres SQL-Skripts. Wenn Sie sie für einen anderen Server versenden möchten, entfernen Sie einfach diese 3 Abfragen und schon sind Sie fertig. Noch bequemer können Sie ein Skript mit dem Namen script_mysql.sql erstellen, das die oben genannten Abfragen zur Einstellung des Modus enthält, ein Skript script_ansi.sql als Quelle verwenden und den Modus zurücksetzen.

Charalampos Serenis
quelle
Das ist toll! Ich kann die Abfrage einmal schreiben und einfach einen Schalter für MySQL-Stacks setzen!
Ravemir