【问题标题】:INSERT INTO PostgreSQL插入 PostgreSQL
【发布时间】:2013-08-27 13:29:52
【问题描述】:

我在使用 SQL 时遇到了一点问题。 我正在尝试在我的表中插入 2 个值。

这是我的查询: INSERT INTO tableinfo (table,date) VALUES ('Sell','24 August'); 但它不起作用。我有类似的东西:

SQL error:
ERROR:  syntax near "INTO"
LINE 1: SELECT COUNT(*) AS total FROM (INSERT INTO tableinfo (table,...
                                              ^
In statement::
SELECT COUNT(*) AS total FROM (INSERT INTO tableinfo (table,date) VALUES ('Sell','24 August')) AS sub

这是非常基本的,所以我不知道为什么它不起作用:( PostgreSQL 9.2.4

【问题讨论】:

  • 错误信息是什么?
  • 你不能像这样组合插入和选择。你想达到什么目的? (并且您可能希望将 psql 切换为英文错误消息,以便这里的每个人都可以阅读它们)。
  • 你在使用phpAdmin吗?
  • 顺便说一句:count(*) 的值将始终为 1(一),因为您尝试插入单行 - 所以我不明白 count() 的用途。

标签: sql postgresql insert phppgadmin


【解决方案1】:

我已经安装了 phpPgAdmin 来尝试重现您的错误。我在尝试创建测试表时立即得到它:

看起来 phpPgAdmin 将您的查询包装到 select count(*) as total from (...) 中。我发现只有在查询页面上的 checkbox "Paginate results" 设置为 on 时才会发生这种情况(显然 phpPgAdmin 试图计算它将获得多少行,然后逐页显示)。取消选中它,您的查询将正常工作:

【讨论】:

  • 我没有勾选分页结果,一切正常。
【解决方案2】:

问题不是 INSERT,而是您尝试发出的无效 SQL。先尝试插入,然后再尝试单独的 count(*) 查询,或者如果您使用的是 PostgreSQL 9.1+,则可以使用 Common Table Expressions 和 RETURNING

WITH ins AS (
     insert into tableinfo ("table","date") 
     values ('Sell','24 August') RETURNING "table"
)
select count(*) 
from ins;

【讨论】:

  • Data-modifying CTEs a.k.a. writable CTEs 自 Postgres 9.1 起可用。
  • 哦,对了,我总是忘记这一点——我在生产中从 9.0 跳到了 9.2。谢谢,我会更新我的答案以反映这一点。
【解决方案3】:

错误信息无法理解。但就其可见性而言,您无法从执行的操作中进行选择 (INSERT)。 SELECT 语句仅在从关系中选择后显示。对于您的情况,另一种选择是分别执行 2 个查询,或者如果您被允许执行一次,则使用事务。

【讨论】:

  • 可以INSERT 语句的结果中进行选择。请参阅 bma 的答案。但完全不清楚(至少对我而言)OP 到底想做什么。
【解决方案4】:

据我所知,select 的输入不是通过insert 语句插入数据的基础表,而是缺少插入语句的返回值(例如RETURNING)在这里。

看看(优秀的)Postgres documentation 尤其是可以使用插入的with_query_name 部分。

【讨论】:

    猜你喜欢
    • 2017-10-11
    • 2016-08-29
    • 2011-08-30
    • 2019-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多