Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Syntaxfehler aufgrund der Verwendung eines reservierten Wortes als Tabellen- oder Spaltenname in MySQL

Das Problem

In MySQL werden bestimmte Wörter wie SELECT , INSERT , DELETE usw. sind reservierte Wörter. Da sie eine besondere Bedeutung haben, behandelt MySQL dies als Syntaxfehler, wenn Sie sie als Tabellennamen, Spaltennamen oder andere Arten von Bezeichnern verwenden – es sei denn, Sie umgeben den Bezeichner mit Backticks.

Wie in den offiziellen Dokumenten erwähnt, im Abschnitt 10.2 Schema Object Names (Hervorhebung hinzugefügt):

Bestimmte Objekte in MySQL, einschließlich Datenbank, Tabelle, Index, Spalte, Alias, Ansicht, gespeicherte Prozedur, Partition, Tablespace und andere Objektnamen, sind als Identifikatoren bekannt .

...

Wenn eine Kennung Sonderzeichen enthält oder ein reserviertes Wort ist , Sie müssen zitiere es, wann immer du dich darauf beziehst.

...

Das Anführungszeichen des Bezeichners ist der Backtick ("` "):

Eine vollständige Liste der Schlüsselwörter und reservierten Wörter finden Sie im Abschnitt 10.3 Schlüsselwörter und Reservierte Wörter . Auf dieser Seite sind Wörter, denen "(R)" folgt, reservierte Wörter. Einige reservierte Wörter sind unten aufgeführt, darunter viele, die dieses Problem verursachen können.

  • HINZUFÜGEN
  • UND
  • VORHER
  • VON
  • RUFEN
  • FALL
  • ZUSTAND
  • LÖSCHEN
  • ABSCHREIBEN
  • BESCHREIBEN
  • VON
  • GRUPPE
  • EIN
  • INDEX
  • EINFÜGEN
  • INTERVALL
  • IST
  • SCHLÜSSEL
  • Gefällt mir
  • GRENZE
  • LANG
  • VERGLEICH
  • NICHT
  • OPTION
  • ODER
  • BESTELLUNG
  • PARTITION
  • RANG
  • REFERENZEN
  • AUSWÄHLEN
  • TABELLE
  • AN
  • AKTUALISIEREN
  • WO

Die Lösung

Sie haben zwei Möglichkeiten.

1. Verwenden Sie keine reservierten Wörter als Bezeichner

Die einfachste Lösung besteht einfach darin, die Verwendung von reservierten Wörtern als Bezeichner zu vermeiden. Sie können wahrscheinlich einen anderen vernünftigen Namen für Ihre Spalte finden, der kein reserviertes Wort ist.

Dies hat einige Vorteile:

  • Es schließt die Möglichkeit aus, dass Sie oder ein anderer Entwickler, der Ihre Datenbank verwendet, versehentlich einen Syntaxfehler schreiben, weil Sie vergessen – oder nicht wissen –, dass ein bestimmter Bezeichner ein reserviertes Wort ist. Es gibt viele reservierte Wörter in MySQL und die meisten Entwickler kennen sie wahrscheinlich nicht alle. Indem Sie diese Wörter gar nicht erst verwenden, vermeiden Sie es, sich selbst oder zukünftigen Entwicklern Fallen zu stellen.

  • Die Art, Bezeichner in Anführungszeichen zu setzen, unterscheidet sich zwischen SQL-Dialekten. Während MySQL standardmäßig Backticks zum Zitieren von Bezeichnern verwendet, ist ANSI-kompatibles SQL (und tatsächlich MySQL im ANSI-SQL-Modus, wie angemerkt hier ) verwendet doppelte Anführungszeichen zum Anführen von Bezeichnern. Daher sind Abfragen, die Bezeichner mit Backticks zitieren, weniger leicht auf andere SQL-Dialekte übertragbar.

Nur um das Risiko zukünftiger Fehler zu verringern, ist dies normalerweise eine klügere Vorgehensweise, als den Bezeichner in Backticks zu zitieren.

2. Backticks verwenden

Wenn das Umbenennen der Tabelle oder Spalte nicht möglich ist, schließen Sie die fehlerhafte Kennung in Backticks ein (` ), wie im früheren Zitat von 10.2 Schema Object Names beschrieben .

Ein Beispiel zur Veranschaulichung der Verwendung (aus 10.3 Schlüsselwörter und reservierte Wörter ). ):

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)

In ähnlicher Weise kann die Abfrage aus der Frage behoben werden, indem das Schlüsselwort key umschlossen wird in Backticks, wie unten gezeigt:

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