Syntax-Fehler aufgrund von ein reserviertes Wort als Tabellen-oder Spaltennamen in MySQL
Ich versuche, führen Sie eine einfache MySQL-Abfrage wie folgt:
INSERT INTO user_details (username, location, key)
VALUES ('Tim', 'Florida', 42)
Aber ich bin immer der folgende Fehler:
ERROR 1064 (42000): Sie haben einen Fehler in Ihrer SQL-syntax; Lesen Sie im Handbuch, das entspricht Ihrer MySQL-server-version für den richtigen syntax zur Verwendung in der Nähe von
'key) VALUES ('Tim', 'Florida', 42)'
in Zeile 1
Wie kann ich das Problem beheben?
Wenn Sie schon weitergeleitet wurden, hier aber Sie erhalten keine Fehlermeldung, sind Sie wahrscheinlich Versagen Fehler überprüfen. Schauen Sie bitte für Ratschläge, wie Sie es für Ihre Sprache, Bibliothek und/oder tool—nicht nur hier posten, jedes mal, wenn etwas nicht funktioniert. Danke!!!
Warum nur
Denn jede Implementierung hat einen anderen Geschmack von SQL und was gilt für MySQL vielleicht nicht unbedingt für andere Aromen. Ein Verweis Frage könnte auftauchen wenn die jeweiligen community hält, eine Notwendigkeit für Sie,, sonst würde ich nicht darum kümmern. Und nach einem Dutzend Referenz Fragen, die beats mit tausenden von doppelten Fragen IMO.
Ich habe das wiki sperren hier, weil es fing an, fallen viele Antworten, die don nichts hinzufügen.
Warum nur
MySQL
? Ist dies nicht ein problem in den Technologien/Sprachen? Sollte nicht so eine Referenz/kanonische Frage/Antwort gilt unabhängig davon, ein tag? Wir haben einen anderen, ähnlichen Referenz-QS-separat für SQLServer
weil die backticks nicht anzuwenden; oder C
oder C#
oder VB
und wir könnten am Ende mit einem hundert solcher Verweis QA?Denn jede Implementierung hat einen anderen Geschmack von SQL und was gilt für MySQL vielleicht nicht unbedingt für andere Aromen. Ein Verweis Frage könnte auftauchen wenn die jeweiligen community hält, eine Notwendigkeit für Sie,, sonst würde ich nicht darum kümmern. Und nach einem Dutzend Referenz Fragen, die beats mit tausenden von doppelten Fragen IMO.
Ich habe das wiki sperren hier, weil es fing an, fallen viele Antworten, die don nichts hinzufügen.
InformationsquelleAutor |
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Problem
In MySQL bestimmte Wörter wie
SELECT
,INSERT
,DELETE
etc. sind reservierte Wörter. Da Sie eine Besondere Bedeutung haben, MySQL-behandelt es als eine syntax-Fehlermeldung, wenn Sie verwenden Sie als Namen einer Tabelle, Spalte name, oder eine andere Art von Bezeichner - es sei denn, Sie umgeben den Bezeichner mit backticks.Wie bereits in den offiziellen docs, die in Abschnitt 10.2 Schema Object Names (Hervorhebung Hinzugefügt):
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. In diese Seite, Worte, gefolgt von "(R)" sind reservierte Wörter. Einige reservierte Wörter, die unten aufgelistet sind, darunter auch viele, die dazu neigen, die dieses Problem verursachen.
Die Lösung
Haben Sie zwei Möglichkeiten.
1. Nicht reservierte Wörter als Bezeichner
Die einfachste Lösung ist, einfach zu vermeiden Sie die Verwendung reservierter Wörter als Bezeichner. Sie können wahrscheinlich feststellen, einen anderen angemessenen Namen für die Spalte ein, ist nicht ein reserviertes Wort.
Tun, das hat ein paar Vorteile:
Beseitigt es die Möglichkeit, dass Sie oder ein anderer Entwickler mit Ihrer Datenbank versehentlich schreiben Sie einen syntax-Fehler aufgrund von vergessen oder nicht zu wissen -, dass ein bestimmter Bezeichner ein reserviertes Wort ist. Es gibt viele reservierte Wörter in MySQL und die meisten Entwickler wahrscheinlich nicht alle von Ihnen wissen. Nicht mit diesen Worten in den ersten Platz, Sie vermeiden, dass Sie fallen für Sie selbst oder für zukünftige Entwickler.
Das Mittel der Quotierung von Bezeichnern unterscheidet sich zwischen den SQL-Dialekten. Während MySQL backticks verwendet für die Quotierung von Bezeichnern standardmäßig ANSI-konforme SQL (und zwar MySQL im ANSI-SQL-Modus, wie bereits hier) verwendet, doppelte Anführungszeichen für die Quotierung von Bezeichnern. Als solche Abfragen, die quote identifiers mit backticks sind weniger leicht tragbar auf andere SQL-Dialekte.
Rein aus Gründen der Verringerung des Risikos von künftigen Fehlern, dies ist in der Regel klüger Vorgehen als "backtick" -unter Angabe der Kennung.
2. Benutze backticks
Umbenennen der Tabelle oder Spalte ist nicht möglich, wickeln Sie die beanstandeten Bezeichner in backticks (
`
), wie beschrieben in dem früheren Zitat aus 10.2 Schema Object Names.Ein Beispiel um die Verwendung zu demonstrieren (aus 10.3 Schlüsselwörter und Reservierte Wörter):
Ebenso die Abfrage aus der Frage, können behoben werden, durch das einwickeln der keyword -
key
in backticks, wie unten gezeigt:und
end
werden nicht reservierte Wörter. Das obige Beispiel war nur um zu zeigen, wie die Fehlermeldung kann behoben werden, indem mit backticks. Und einfach nicht ein reserviertes Wort ist eine bessere Praxis als blind backtick-Schreibweise aller Bezeichner, auch wenn Sie nicht benötigt werden.Ich Stimme zu Lösung 1 ist besser, wenn jemand tatsächlich die Wahl der Bezeichner-Namen. Wenn der name nicht verändert werden kann, wie in Lösung 2, zu untersuchen, welche Bezeichner sind Schlüsselwörter, und wenn diese Schlüsselwörter sind reserviert oder nicht (auch wenn zukünftige Versionen ?), ist eine Quelle der Komplikation. BTW, die entfernt von -1 wie das Beispiel stammt eigentlich aus der Anleitung.
Neue reservierte Wörter erstellt werden, die Häufig in MySQL, mit neuen Versionen. Zum Beispiel, nicht blockierende in MySQL 5.7. Zitieren systematisch dazu neigt, mehr zu sein robust auf änderungen und hilft upgrades. Als für das entfernen von -1, war ich optimistisch. Sie sind richtig, meine Entfernung konnte aufgrund dieser timer.
Es didnot für mich arbeiten, die in sql server 2008. Ich habe stattdessen [ ] große Klammern zB : [interval], die hat den trick für mich. Ich hoffe, dass es hilfreich ist, jemanden nur für den Fall
InformationsquelleAutor