小编And*_*ndy的帖子

从 CTE 内部调用时未执行 PostgreSQL 函数

只是希望证实我的观察并得到有关为什么会发生这种情况的解释。

我有一个函数定义为:

CREATE OR REPLACE FUNCTION "public"."__post_users_id_coin" ("coins" integer, "userid" integer) RETURNS TABLE (id integer) AS '
UPDATE
users
SET
coin = coin + coins
WHERE
userid = users.id
RETURNING
users.id' LANGUAGE "sql" COST 100 ROWS 1000
VOLATILE
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
Run Code Online (Sandbox Code Playgroud)

当我从 CTE 调用此函数时,它执行 SQL 命令但不触发该函数,例如:

WITH test AS
(SELECT * FROM __post_users_id_coin(10, 1))

SELECT
1 -- Select 1 but update not performed
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我从 CTE 调用该函数,然后选择 CTE 的结果(或在没有 CTE 的情况下直接调用该函数),它将执行 SQL 命令并触发该函数,例如: …

postgresql cte

16
推荐指数
2
解决办法
2418
查看次数

PostgreSQL 9.6 列删除和对带有 CTE 的 SQL 函数的副作用

如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 D 的当前位置。我将使用以下方法:

  1. 引入 2 个新列作为 C 和 D2。
  2. 将 D 的内容复制到 D2。
  3. 删除 D。
  4. 将 D2 重命名为 D。

新的顺序是 A、B、C 和 D。

我认为这是一种合法的做法,因为(到目前为止)它没有产生任何问题。

但是,今天我遇到了一个问题,当一个函数在同一张表上执行语句时返回以下错误:

table row type and query-specified row type do not match

以及以下细节:

Query provides a value for a dropped column at ordinal position 13

我尝试重新启动 PostgreSQL,VACUUM FULL按照此处此处的建议执行并最终删除并重新创建该函数,但这些解决方案不起作用(除了他们尝试解决系统表已被更改的情况之外)。

有幸使用一个非常小的数据库,我导出了它,删除了它,然后重新导入它并解决了我的功能问题


我意识到这样一个事实,即不应通过修改系统表(弄脏pg_attribute等)弄乱列的自然顺序,如下所示:

是否可以更改 Postgres 中列的自然顺序?

从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …

postgresql metadata database-internals functions postgresql-9.6

15
推荐指数
1
解决办法
1762
查看次数

使用 PostgreSQL 实现 k 均值集群的实用方法

我正在寻找一种超级简单且非常实用的方法,仅使用 PostgreSQL 数据库来对问题进行 k 均值聚类。

虽然我完全意识到,如果我的假设不成立,这种方法可能不会产生有意义的结果,但这可能是对我的数据进行分类的一次很好的首次尝试。

想象一个小型在线论坛,用户可以自由地提出有关他们想要的任何主题的简短问题,但无需对它们进行分类,并且如果新问题与他们之前感兴趣的主题相匹配,则需要通知其他用户订阅了。

我的计划是首先使用将每个传入的问题分解为词位,to_tsvector但老实说,我对之后要做什么有点迷失。

即使假设我已经正确识别了问题可能匹配的k个类别,我将如何决定问题是否应属于一个(或多个)类别?

postgresql full-text-search group-by

5
推荐指数
1
解决办法
688
查看次数