【问题标题】:cannot get simple PostgreSQL insert to work无法让简单的 PostgreSQL 插入工作
【发布时间】:2012-09-07 20:28:57
【问题描述】:

我正在尝试对 postgres 表执行简单的插入操作,但出现错误提示我尝试插入的值被解释为列名

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")

我已经将我的表名放在双引号中,因为我应该阅读 here

并使用DEFAULT 自动增加ID,因为我应该阅读here

有什么想法吗? 谢谢!

【问题讨论】:

  • 对“汽车经销商”使用单引号。
  • 单引号。去掉id。
  • @muratgu 给出错误:ERROR: ERROR: syntax error at or near "'imageTagBusinessMainCategory'" Position: 13
  • @PaulTomblin 你是什么意思“离开身份证”?谢谢!
  • 我的意思是它在@Randy 的回答中显示。除了看起来您还需要在列名周围加上双引号。

标签: sql postgresql string-constant


【解决方案1】:

请改用'auto dealer'。 PostgreSQL 将 " 解释为标识符的引号,' 解释为字符串的引号。

还有:

  • 如果这是一个新项目,请不要使用大小写混合表;它是一个 后来的挫败感。而不是能够使用任何案例 您的 SQL 语句,您必须同时引用标识符名称并获取 大小写正确。

  • 不需要指定id/DEFAULT,你是 要求它做它已经做的事情。我还没有遇到过 DBMS 这需要你包含columnName/DEFAULT,如果你想要的话 把默认值放在列里,所以我不认为这个额外的KV pair 将使正在阅读的任何人都更清楚正在发生的事情 稍后你的代码。

【讨论】:

  • 这给了我这个错误ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
  • 您可能以混合大小写创建列,就像表名一样。如果是这种情况,您还必须引用列名。命名时停止使用混合大小写,你会为大家省去很多痛苦。
  • @Matt 我面临同样的问题,当我必须输入这些双引号时,尝试将 pg 与 C++ 一起使用是一件痛苦的事情。没有像某些设置这样的解决方法可以消除对这些引号的需求吗?
  • @itsols “也”的拳头子弹将消除对引号的需要;仅使用 [a-z0-9] 定义您的身份,并且不要将它们指定为具有任何特殊情况(定义不带引号)。然后,您可以随意引用它们,而无需永远使用引号。如果您或其他人认为使用空格或驼峰式命名的表名非常重要,请尽情享受引用!
  • 点得好,马特...我想我在某种程度上已经习惯了 CamelCase - 已经很长时间了(超过 20 年)...实际上问题不在于双重-引用(是的,没有它会更容易),但真正的痛苦是不得不用字符串来逃避它们。直到我将 C++ 和 pg 放在一起,我才看到这一点。无论如何感谢您的投入!
【解决方案2】:
INSERT INTO "imageTagBusinessMainCategory"
("businessMainCategory")
VALUES
('auto dealer')

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

【讨论】:

  • 嗨,谢谢。这给出了这个错误:ERROR: ERROR: column "businessmaincategory" of relation "imageTagBusinessMainCategory" does not exist
  • 听起来您也需要将列名放在双引号中。 PostgreSQL 中混合大小写的表名是一个坏主意的原因之一。
  • @DavidFaber 是的,你是对的。虽然有点难以阅读..我可以使用破折号吗? ^^
  • @DavidFaber:我个人认为需要引用的标识符(例如混合大小写)在 any DBMS 中是个坏主意
  • 请记住,除了创建标识符时,您可以在任何地方以混合大小写和不带引号的方式引用它。因此可以使用select * from thisHasAReallyLongName 访问名为thishasareallylongname 的表。
【解决方案3】:

Postgres、Oracle 等希望列名在大小写混合时用引号引起来。因此,要么为你的表格列创建一个全部小写或全部大写的约定,要么按照 David Faber 的建议使用引号

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

【讨论】:

    【解决方案4】:

    在我的情况下,我不得不将列名从 camelCase 'isAdmin' 更改为 snake_case 'is_admin'

    【讨论】:

      猜你喜欢
      • 2015-07-09
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-20
      相关资源
      最近更新 更多