【问题标题】:update postgresql with syntax errors使用语法错误更新 postgresql
【发布时间】:2014-07-31 14:41:30
【问题描述】:

我有一张名为 test 的表,它有 4 列:

id     INT
v_out  INT
v_in   INT
label  CHARACTER

我正在尝试使用以下查询更新表:

String sql = "
update
    test
set
    v_out = temp.outV
    , v_in = temp.inV
    , label = temp.label
from (
        values
            (1,234,235,'[abc]') // these value are read from other places
            ,(2,234,5585,'[def]') //[abc] = object.toString();
    ) as temp (e_id, outV, inV, label)
where
    id = temp.e_id;

当我执行它时,我得到了错误: org.postgresql.util.PSQLException:错误:“[”或附近的语法错误

在出现此错误之前,我已经更新了 3000 多行。

那是什么原因造成的呢?是因为“[”这个字符吗? 这是原始表格:

create table edges(
 id serial not null primary key,
 vertex_out int, 
 vertex_in int, 
 label character varying(255),
 constraint fk_vertex_out foreign key (vertex_out) references vertices(id) on delete cascade,
 constraint fk_vertex_in foreign key (vertex_in) references vertices(id) on delete cascade
);

【问题讨论】:

  • 这看起来不错:sqlfiddle.com/#!15/d7f14/2 一定有什么你没有告诉我们。
  • 我怀疑label 的类型是CHARACTER。 (这将是单个字符,与 char(1) 相同。)请提供您的实际表定义 - 您在 psql 中使用 \t tbl 得到的结果。
  • 创建表边(id SERIAL NOT NULL PRIMARY KEY, vertex_out INT, vertex_in INT, label CHARACTER VARYING (255), CONSTRAINT fk_vertex_out FOREIGN KEY (vertex_out) REFERENCES vertices (id) ON DELETE CASCADE, CONSTRAINT fk_vertex_in FOREIGN KEY (vertex_in) REFERENCES vertices (id) ON DELETE CASCADE );
  • (1) 那些// "cmets" 真的在你的SQL 中吗? (2) 您是否使用字符串插值来构建您的 SQL?
  • 不,我只是把它们加在那里让人们理解。当我更新时,这些 cmets 将被删除。

标签: sql postgresql sql-update


【解决方案1】:

这里最可能的问题是 SQL 查询中的字符串插值(这是一个非常不好的做法)。

看这个例子:

  values
      (1,234,235,'[abc]''),
      (2,234,5585,'[def]')

第一个对象名称中的' 符号违反了字符串边界,导致第二行出现ERROR: syntax error at or near "[":

您可以在互联网上搜索SQL Injection以获取有关此问题的详细信息。

【讨论】:

  • 我在第一个对象中没有 2 ' '。
  • 你能解释一下吗?因为当 obj.toString() = abc 时,它可以用 'abc' 值更新表。当 obj.toString() = [abc] 时,我不能用这个 '[abc]' 更新
  • @user3895614 你能得到一个原始查询,即发送到 Postgres 吗?在您的应用程序中构建查询之后。或者只显示应用程序代码。
  • 顺便说一句,我认为这可能是因为“;”,我的数据是 '[QIOException;]',可能不是由“[”而是“;”引起的???在我更新之前,对象 [QIOException] 被转换为字符串,所以它不应该导致问题
  • @user3895614 你收到的是syntax error at or near "["。这意味着符号[ 在字符串之外(如果' 在一对之外)。这可能在 2 种情况下发生:1)您忘记添加 ' 2)某些东西“破坏”了您的字符串。该字符串可以被' 或其他一些符号打破,但不能被[; 打破
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
相关资源
最近更新 更多