无法使简单的PostgreSQL插入工作


82

我试图在postgres表中做一个简单的插入,但是却收到一个错误,我试图插入的值被解释为列名

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

其中id设置为主键,并且自动递增,而不是null。这些是我在phpPgAdmin中设置表格时打勾的框。

我收到此错误:

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

我已经将表名放在双引号中,正如我在这里阅读的那样。

DEFAULT按照我在此处阅读的内容自动增加ID 。

有任何想法吗?谢谢!


13
对“汽车经销商”使用单引号。
muratgu 2012年

2
单引号。离开ID。
Paul Tomblin 2012年

出现错误的ERROR: ERROR: syntax error at or near "'imageTagBusinessMainCategory'" Position: 13
@muratgu

@PaulTomblin你是什么意思“离开身份证”?谢谢!
1252748年

我的意思是像@Randy的答案中所示。除了看起来您还需要在列名两边加上双引号之外。
Paul Tomblin 2012年

Answers:


165

使用'auto dealer'代替。PostgreSQL解释"为标识符的'引号和字符串的引号。

也:

  • 如果这是一个新项目,请不要使用大小写混合的表格;以后会感到沮丧。不能在SQL语句中使用任何大小写,必须同时引用标识符名称并正确区分大小写。

  • 无需指定id/ DEFAULT,而只是要求它执行本来应该做的事情。我还没有遇到一个DBMS,该DBMS要求您包含columnName/(DEFAULT如果您希望它在列中放入默认值),所以我认为这对额外的KV对不会使以后阅读您的代码的人更清楚。


这给了我这个错误ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748年

1
您可能创建了混合大小写的列,就像表名一样。在这种情况下,您还必须引用列名。停止在命名中使用大小写混合,您将为每个人省去很多麻烦。
马特

@Matt我也面临着同样的问题,当我不得不键入那些双引号时,尝试将pg与C ++一起使用是一种痛苦。是否没有像某些设置这样的替代方法可以消除对这些引号的需求?
itsols

@itsols“也”的拳头将消除引号的需要;仅使用[a-z0-9]定义您的身份,请勿将其指定为具有任何特殊情况(定义时不加引号)。然后,您可以引用它们,但需要永久不加引号。如果您或其他人认为使用空格或驼峰式表名确实很重要,那么请随时随地引用报价!
马特

Matt,点了点...我想我已经习惯了CamelCase了-已经很长时间了(超过20年)...实际上麻烦不在双引号了(是的,这样会更容易没有它),但真正的痛苦是必须将它们按字符串转义。在将C ++和pg放在一起之前,我没有看到这种情况。无论如何,谢谢您的投入!
itsols

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

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


1
你好谢谢。会出现此错误:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
1252748年

听起来您也需要将列名放在双引号中。在PostgreSQL中使用大小写混合的表名的一个不好的主意。
David Faber 2012年

@DavidFaber是的,你是对的。虽然有点难读..我可以用破折号吗?^^
1252748 2012年

1
@DavidFaber:我个人认为需要引用的标识符(例如,大小写混合)在任何DBMS中都是个坏主意
a_horse_with_no_name 2012年

1
请记住,除了创建标识符外,在任何地方都可以使用大小写混合且不带引号的引用。因此,thishasareallylongname可以使用来访问名为的表select * from thisHasAReallyLongName
马特

4

Postgres,Oracle等希望列名混合大小写时使用引号引起来。因此,要么为表列创建所有大小写的约定,要么按照David Faber的建议使用引号

INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.