【问题标题】:DELETE FROM ... reporting syntax error at or near "."DELETE FROM ... 报告“.”处或附近的语法错误
【发布时间】:2015-11-04 16:24:11
【问题描述】:

我试图从我的数据库中删除一个数据,但是,当我编写命令时,我不断收到一些语法错误,你能告诉我错误在哪里吗?

这是我尝试过的命令:

DELETE FROM database_userprofile WHERE user.username = 'some';
ERROR:  syntax error at or near "."
LINE 1: DELETE FROM database_userprofile WHERE user.username = 'some'...

DELETE FROM database_userprofile USING database_user WHERE user.username="some";
ERROR:  syntax error at or near "."
LINE 1: ... database_userprofile USING database_user WHERE user.username=...

希望你能帮助我

【问题讨论】:

  • 总是包括游览 PostgreSQL 版本和任何相关的表定义。解释你想要达到的目标,这样我们就不必猜测也有帮助。这次还是要投票,因为您确实包含了完整、准确的命令文本和错误(谢谢!)。

标签: database postgresql row delete-row sql-delete


【解决方案1】:

您的查询没有任何意义。

DELETE FROM database_userprofile WHERE user.username = 'some';
                                       ^^^^

user 是从哪里来的?查询中未引用它。是database_userprofile的一列吗?如果是这样,你不能写user.username(除非它是一个复合类型,在这种情况下你必须写(user).username来告诉解析器;但我怀疑它是一个复合类型)。

直接原因是user is a reserved word。你不能在不引用的情况下使用该名称:

DELETE FROM database_userprofile WHERE "user".username = 'some';

...但是,这个查询仍然没有意义,它只会给出一个不同的错误:

regress=> DELETE FROM database_userprofile WHERE "user".username = 'some';
ERROR:  missing FROM-clause entry for table "user"
LINE 1: DELETE FROM database_userprofile WHERE "user".username = 'so...

我的疯狂猜测是您正在尝试对连接执行删除操作。我假设您有如下表格:

CREATE TABLE "user" (
    id serial primary key,
    username text not null,
    -- blah blah
);

CREATE TABLE database_userprofile (
     user_id integer references "user"(id),
     -- blah blah
);

并且您正在尝试使用另一个表中的条件进行删除。

如果是这样,你不能只写user.username。您必须使用:

DELETE FROM database_userprofile
USING "user"
WHERE database_userprofile.user_id = "user".id
AND "user".username = 'fred';

您会注意到我用双引号括起了“用户”。那是因为它是一个关键字,不应该真正用于表名或其他用户定义的标识符。双引号会强制将其解释为标识符而不是关键字。

【讨论】:

    【解决方案2】:

    由于文档的原因,PostgreSQL 9.1 中删除的语法是:

    [ WITH [ RECURSIVE ] with_query [, ...] ]
    DELETE FROM [ ONLY ] table [ * ] [ [ AS ] alias ]
        [ USING using_list ]
        [ WHERE condition | WHERE CURRENT OF cursor_name ]
        [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ]
    

    所以您需要在 DELETE 命令后指定“table_name”,而不是“database_name”。
    只有登录数据库才能删除数据。

    你有
    错误:“.”处或附近的语法错误
    因为在 WHERE 部分中,您可以指定目标表或 usinglist 中的表。

    【讨论】:

    • 其实直接原因是user是保留字。
    【解决方案3】:

    在将查询从 Eclipse 复制粘贴到 pgadmin 时,您也可能会收到此错误。不知何故,可能会插入一个奇怪的符号。为避免此错误,请先将其粘贴到简单的文本编辑器(如记事本)中,然后从那里剪切并粘贴到 pgadmin 中。

    【讨论】:

      猜你喜欢
      • 2019-01-20
      • 2018-01-26
      • 2014-04-26
      • 1970-01-01
      • 2017-02-20
      • 1970-01-01
      • 2013-09-10
      • 2017-06-10
      • 2015-02-23
      相关资源
      最近更新 更多