只是希望证实我的观察并得到有关为什么会发生这种情况的解释。
我有一个函数定义为:
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 命令并触发该函数,例如: …
如果我有一个包含 3 列的表格——比如 A、B 和 D——并且我不得不引入一个新的——比如 C 来替换 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等)来弄乱列的自然顺序,如下所示:
从我的函数抛出的错误来看,我现在意识到用我的方法改变列的顺序也是一个禁忌。任何人都可以说明为什么我所做的也是错误的? …
postgresql metadata database-internals functions postgresql-9.6
我正在寻找一种超级简单且非常实用的方法,仅使用 PostgreSQL 数据库来对问题进行 k 均值聚类。
虽然我完全意识到,如果我的假设不成立,这种方法可能不会产生有意义的结果,但这可能是对我的数据进行分类的一次很好的首次尝试。
想象一个小型在线论坛,用户可以自由地提出有关他们想要的任何主题的简短问题,但无需对它们进行分类,并且如果新问题与他们之前感兴趣的主题相匹配,则需要通知其他用户订阅了。
我的计划是首先使用将每个传入的问题分解为词位,to_tsvector但老实说,我对之后要做什么有点迷失。
即使假设我已经正确识别了问题可能匹配的k个类别,我将如何决定问题是否应属于一个(或多个)类别?