【问题标题】:PostgreSQL ERROR: INSERT has more target columns than expressions, when it doesn'tPostgreSQL 错误:插入的目标列多于表达式,但它没有
【发布时间】:2015-02-22 17:02:07
【问题描述】:

所以我从这个开始......

SELECT * FROM parts_finishing;

...我明白了...

id,id_part,id_finish,id_metal,id_description,日期, inside_hours_k,inside_rate,outside_material

(0 行)

...所以到目前为止一切看起来都很好,所以我这样做了...

INSERT INTO parts_finishing 
(
 id_part, id_finish, id_metal, id_description, 
 date, inside_hours_k, inside_rate, outside_material
) VALUES (
('1013', '6', '30', '1', NOW(), '0', '0', '22.43'), 
('1013', '6', '30', '2', NOW(), '0', '0', '32.45'));

...我得到...

错误:INSERT 的目标列多于表达式

现在我已经做了一些事情,比如确保数字不在引号中,在引号中(希望有一个关于整数、数字类型等的表格指南)之后我显然计算了插入的列名和值的数量。我还尝试确保所有逗号都是逗号......在这里真的很茫然。除了idbigserial primary key 之外,没有其他列。

【问题讨论】:

  • 值列表周围有一组额外的()。就这样。顺便说一句:引用的值都引用 (var)char 列?
  • @wildplasser PHP 的转义 (mysqli_real_escape_string) 无法防止使用引号破坏 SQL 命令格式的注入攻击,因此切勿在 SQL 语句中使用非引号值

标签: postgresql


【解决方案1】:

去掉多余的()

INSERT INTO parts_finishing 
(
 id_part, id_finish, id_metal, id_description, 
 date, inside_hours_k, inside_rate, outside_material
) VALUES 
  ('1013', '6', '30', '1', NOW(), '0', '0', '22.43')
, ('1013', '6', '30', '2', NOW(), '0', '0', '32.45')
  ;

Postgres 中的(..., ...)元组文字的语法; ( ) 的额外集合将创建一个元组,这没有任何意义。

另外:对于数字文字,您不需要引号:

(1013, 6, 30, 1, NOW(), 0, 0, 22.43)
, ...

,假设所有这些类型都是数字。

【讨论】:

  • dDBeaver 使用这些额外的双亲导出数据
  • 这么简单的事情,但看起来 () 应该是一个有效的语法......哦,好吧,很高兴我解决了我非常相似的问题。
  • 额外的() 有效的语法。只有语义不同。
【解决方案2】:

我在 Python 中使用带有psycopg2SQL 字符串组合时遇到了类似的问题,但问题略有不同。我在其中一个字段后缺少逗号。

INSERT INTO parts_finishing
(id_part, id_finish, id_metal)
VALUES (
    %(id_part)s <-------------------- missing comma
    %(id_finish)s,
    %(id_metal)s
);

这导致psycopg2 产生此错误:

错误:INSERT 的目标列多于表达式。

【讨论】:

    【解决方案3】:

    这发生在我的大插入中,一切正常(逗号),我花了一段时间才注意到我插入到 错误的表当然数据库不知道你的意图。 复制粘贴是万恶之源... :-)

    【讨论】:

      【解决方案4】:

      我也遇到了同样的问题。当给定的列数和给定的列值不匹配时,就会出现这个问题。

      【讨论】:

        【解决方案5】:

        我在使用 PostgreSQL 的 express js 上遇到同样的错误

        我解决了。这是我的答案。

        插入记录时发生错误。

        由于值传递的列名无效而发生错误

        错误:INSERT 的目标列多于表达式

        错误:错误:INSERT 的目标列多于表达式 名称:'错误', 长度:116, 严重性:'错误', 代码:'42601', 详细信息:未定义, 提示:未定义, 位置:'294', 内部位置:未定义, 内部查询:未定义, 其中:未定义, 架构:未定义, 表:未定义, 列:未定义, 数据类型:未定义, 约束:未定义, 文件:'analyze.c', 行:'945',

        这是我的代码圆顶

        INSERT INTO student(
          first_name, last_name, email, phone
        ) 
        VALUES 
          ($1, $2, $3, $4), 
        values 
          : [ first_name, 
          last_name, 
          email, 
          phone ]
        

        【讨论】:

        • 我对这个答案感到困惑。你是说你现在有这个问题吗?还是您将此代码作为建议的解决方案发布?
        • 我发布了答案
        • edit你的答案,让它看起来更像一个答案
        猜你喜欢
        • 2020-09-17
        • 2021-12-20
        • 2017-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-15
        • 1970-01-01
        相关资源
        最近更新 更多