无法使简单的PostgreSQL插入工作

128

我试图向PostgreSQL表中插入数据,但是出现了一个错误,提示我尝试插入的值被解释为列名。

INSERT INTO "imageTagBusinessMainCategory"
(id, businessMainCategory)
VALUES
(DEFAULT, "auto dealer")

我的表中id被设置为主键、自动递增和非空。这些都是我在phpPgAdmin中设置表时选中的选项。

然而我现在遇到了如下错误:

ERROR: ERROR: column "auto dealer" does not exist
Query = INSERT
INTO "imageTagBusinessMainCategory"
(id, businessMainCategory)
VALUES
(DEFAULT,
"auto dealer")

我将我的表名用双引号括起来,因为我在这里读到这样做应该是正确的。

并且使用DEFAULT自动增加id,因为我在这里读到这样做应该是正确的。

有什么建议吗? 谢谢!


31
请使用单引号表示“auto dealer”。 - muratgu
4
单引号,去掉ID。 - Paul Tomblin
@muratgu 给出的错误提示: ERROR: ERROR: 在 "'imageTagBusinessMainCategory'" 附近存在语法错误。位置:13 - 1252748
@PaulTomblin 你的意思是“不要包括ID”吗?谢谢! - 1252748
我的意思是像@Randy的答案中所示。除了似乎你还需要在列名周围加上双引号。 - Paul Tomblin
4个回答

231
请使用 'auto dealer' 替代。PostgreSQL把 " 视为标识符的引号,而把 ' 视为字符串的引号。
另外:
  • 如果这是一个新项目,请不要使用大小写混合的表;这会在以后成为一个问题。您不能在SQL语句中使用任何大小写,必须同时引用标识符名称并正确获取大小写。

  • 无需指定id/DEFAULT,它已经执行了它应该执行的操作。我没有遇到过需要在将默认值放入列中时包含 columnName/DEFAULT 的DBMS,因此我认为这个额外的键值对不会使任何读取您代码的人更清楚地知道发生了什么。


1
这个程序出现了错误:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist - 1252748
2
你可能使用了混合大小写来创建列,就像表名一样。如果是这种情况,你还必须引用列名。停止在命名中使用混合大小写,这将为每个人节省很多痛苦。 - Matt
@Matt 我也遇到了同样的问题,而且当我不得不输入这些双引号时,使用C++和pg非常麻烦。难道没有什么解决方法,比如一些设置可以消除这些引号的需要吗? - itsols
@itsols “Also”中的第一条将消除引号的需要;仅使用[a-z0-9]定义您的标识,并不指定它们具有任何特定大小写(未引用定义)。然后,您可以随意引用它们而无需引号。如果您或其他人决定非常重要的表名带有空格或驼峰式命名,则可以随意引用! - Matt
Matt,你说得很对...我想我已经习惯了驼峰式命名法——这已经有很长时间了(超过20年)...实际上,问题不在于双引号(是的,如果没有它会更容易),而是在字符串中必须转义它们,这才是真正的痛苦。直到我将C++和pg结合在一起之前,我才意识到这一点。无论如何,感谢您的建议! - itsols

12
INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')

编辑:在列名周围添加了双引号。


1
嗨,谢谢。这个错误是:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist - 1252748
@DavidFaber,是的,你说得对。但这样会使阅读有点困难... 我能用破折号吗? ^^ - 1252748
1
@DavidFaber:就我个人而言,我认为那些需要引号的标识符(例如混合大小写)在任何DBMS中都是一个坏主意。 - user330315
1
请记住,在创建标识符以外的任何地方,您都可以使用混合大小写且不带引号来引用它。因此,名为thishasareallylongname的表可以使用select * from thisHasAReallyLongName进行访问。 - Matt
匈牙利命名法或驼峰命名法的整个理念是为了提高代码的可读性(至少对我来说是这样)...因此,完全使用小写字段名称对我来说不是一个好选择。我希望有一种好的(我指容易的)方法来解决这个问题。 - itsols
显示剩余4条评论

5

Postgres、Oracle等数据库在处理大小写混合的列名时需要加引号。因此,您可以要么为表中的列创建小写或大写约定,要么像David Faber建议的那样使用引号。

INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')

0
在我的情况下,我需要将列名从驼峰式 'isAdmin' 改为蛇形命名法 'is_admin'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接