我是 PostgreSQL 的新手,一般来说对数据库有点陌生。我们应该如何在 Postgres 中索引UUID值,是否有既定的方法?我分为使用散列和使用特里树,除非已经有内置的东西可以自动使用。无论我使用什么,都将处理大量数据。
SP-GiST 运算符族“text_ops”使用树索引。因为 UUID 很长而且非常不同,所以即使我只会进行完整匹配搜索,这些听起来也很吸引人。
还有一个哈希选项。散列是 O(1),当然除了相等我不需要做任何比较,但是因为 UUID 很长,我担心从它们生成散列会浪费很多时间。
或者这是否过于依赖系统和使用细节?
在大多数情况下,我宁愿使用bigserial,但有人告诉我为此使用uuid。我们需要uuid,因为我们可能有多个服务器使用不同的数据库,因此不能保证我们将拥有唯一的 bigint。我们可以为每个服务器使用不同的序列(和种子),但它仍然不如 UUID 灵活。例如,如果不转换 ID 及其引用,我们将无法将数据库条目从一台服务器迁移到另一台服务器。
使用 PostgreSQL 9.5。似乎 Postgres 与它比较类似于??. 一个唯一的约束是考虑一些相等的字符串,GROUP BY而这些字符串是不同的。
我有一个GROUP BY在TEXT列上使用的选择查询和在其他一些列上使用的聚合函数以确保TEXT输出中列的唯一性,并且我将结果插入到具有主键(因此是唯一的)约束的表中这TEXT列。
看起来与此相似;为简单起见,我刚刚更改了表名:
INSERT INTO mytable ( % mytable has string TEXT PRIMARY KEY, score INT
SELECT
sq1.string string, sq2.score / sq1.score
FROM
(
SELECT n.string string, SUM(n.score) score
FROM
othertable1 n % has string TEXT (non-unique) and score INT
GROUP BY string
) sq1,
(
SELECT n.string string, SUM(n.score) score
FROM
othertable2 n % has string TEXT (non-unique) and score …Run Code Online (Sandbox Code Playgroud) 假设我有一个带id BIGSERIAL列的表。我刚刚开始了一个新的会话。我想知道id我插入的下一行是什么。我怎么能说这个?
我不能简单地SELECT MAX(id) FROM my_table(如果没有找到就返回 1),因为如果我之前删除了东西,下一个id不会是 1,而是会更高。
我已经看过其他使用currval()和的答案nextval()。除非我在当前会话中插入,否则它们不起作用......而且我不想插入一行并查看我得到的 ID,哈哈。
我将要锁定表并在客户端上从 Python 脚本插入大量行,该脚本也在字典中跟踪行 ID。行 ID 必须匹配,所以我需要知道第一个是什么。我很惊讶没有其他人正在处理这种情况。
编辑:除非我在当前会话中插入,否则我对这些功能不起作用的看法是错误的,但请参阅下面的评论。
我有一个文本表和双精度类型。从中,我想构建一个如下所示的 JSON 对象:({"a": 1.0, "b": 1.2, "c": 3.4}编辑:澄清一下,键是表中的文本列,值是双精度列)。请注意,值周围没有引号,因为它们是浮点数,而不是 JSON 标准支持的字符串。
使用 Postgres 9.5。有一个json_build_object函数需要两个并行的文本数组并构建一个带有文本键和文本值的 JSON 对象......也适用于 NULL 值,null在 JSON 中将它们转换为(无引号)。所以我会得到{"a": "1.0", "b": "1.2", "c": "3.4"}。但是如果我想要整数或浮点值怎么办?它不会采用任何数字类型数组。
我现在通过创建自己的函数在 Python 中处理它来解决这个问题!有没有办法在不定义新函数的情况下做到这一点?
CREATE OR REPLACE FUNCTION json_build_object_float_values(keys TEXT[], vals DOUBLE PRECISION[]) RETURNS JSONB AS
$$
assert len(keys) == len(vals)
import json
d = {}
for i in range(len(keys)):
d[keys[i]] = float(vals[i])
return json.dumps(d)
$$
LANGUAGE 'plpython3u' IMMUTABLE;
Run Code Online (Sandbox Code Playgroud)
(请注意,如果您使用它,它会返回 JSONB,但您可以将其更改为 JSON)
编辑,这里是测试输入和预期输出:
CREATE TABLE test (str text, num …Run Code Online (Sandbox Code Playgroud)