我对MySQL有点新手(来自MS SQL),并且在尝试将值插入数据库时最近遇到了一些让我感到困惑的事情。
我通过PHP创建了一个INSERT SQL命令,但发现它在尝试执行时发生错误。
INSERT INTO myTableName (first-name, last-name) VALUES ('Ted', 'Johnson')
以我的方式思考上面的字符串应该有效..但事实并非如此。我甚至尝试在phpMyAdmin中直接使用它,但我得到了相同的语法错误。
唯一能使它工作的是我在SQL语句中用“反引号”或“重音”字符(键盘上波形符号键上的另一个字符)包围字段名称。例如......
INSERT INTO myTableName(`first-name`, `last-name`) VALUES ('Ted', 'Johnson')
我从未在MySQL或MS SQL Server中知道这是必要的。我总是只列出字段名称而不分隔它们。以前有人碰过这个吗?我使用的是MySQL 5.0.77。谢谢。
答案 0 :(得分:6)
您的列名称包含连字符,这通常不是一个好主意,因为解析器可能会误解为first minus name
。反向标记是引用列名称的MySQL方法,以确保它们得到正确处理。
如果您的列是first_name和last_name,则不需要后退。
答案 1 :(得分:5)
如果您的列名与SQL保留字或符号冲突,则只需要反引号。在您的情况下,将first
和name
(以及last
和name
之间的那个)分隔的短划线被解释为减号。此外,MySQL's ALTER TABLE
statement中使用了first
这个词(虽然它实际上没有出现在MySQL's reserved words list中)。如果您可以使用下划线而不是短划线重命名列来分隔单词,则不需要反引号。
答案 2 :(得分:1)
好吧,即使SO语法高亮显示器在你的第一个代码语句中显示last
为蓝色(一个小小的笑话)。我不是MYSQL专家,但我总是使用反引号,因为我想要为自己编程以便始终使用它们。如果你自然地使用反引号,你可以在将来避免很多问题。我也会反击你的桌子:
mysql_query("INSERT INTO `myTableName` (`first-name`, `last-name`) VALUES ('Ted', 'Johnson')");