小编Eva*_*oll的帖子

如何对 JSONB 列中的单个值实现全文搜索?

我有一张表,用于存储两个人之间的对话。

数据将如下所示:

CREATE TABLE foo
AS
  SELECT $$[
    { "user": 1, "timestamp": 1, "message": "First message" },
    { "user": 2, "timestamp": 2, "message": "Second message" },
    { "user": 2, "timestamp": 3, "message": "Debounced message from same user" },
    { "user": 1, "timestamp": 4, "message": "Last message" }
  ]$$::jsonb AS jsondata;
Run Code Online (Sandbox Code Playgroud)

我从不需要单独查找每条消息,所以我只想将整个对话存储在一个jsonb字段中。我需要对所有消息执行全文搜索。

我的第一个想法是创建一个新的文本列,将所有消息连接到一个长字符串中,然后在该列上创建一个三元组 GIN 索引。

这似乎是一种浪费大量空间的 hack,所以我想避免中间列。如何直接从jsonb列创建索引?

postgresql index full-text-search json

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

PostgreSQL 转储和恢复

我似乎无法使用我的数据库在 Windows 上转储/恢复。使用的行和错误消息:

pg_dump -h localhost -U postgres --format=c -O -d ue > latest.dump
pg_restore -h localhost -U postgres -d ue latest.dump
Run Code Online (Sandbox Code Playgroud)

得到这个错误,

pg_restore: [archiver] 输入文件似乎不是有效的存档

有了这个,

pg_dump -h localhost -U postgres -O -d ue > latest.dump
psql -h localhost -U postgres -d ue -f latest.dump
Run Code Online (Sandbox Code Playgroud)

我收到这个错误,

psql:latest.dump:1: 错误:编码“UTF8”的字节序列无效:0xff

我完全被难住了。大多数搜索结果与不使用正确的pg_restore/psql与导出的文件类型有关pg_dump,但正如您在上面看到的,我已经考虑了这一点。

latest.dump 似乎正确填写,至少以纯格式导出我可以阅读的 SQL 并且是数据库的正确导出。

postgresql windows pg-dump pg-restore

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

如何使用 sqlcmd 获取查询时间?

运行 SQL Server 2017,使用交互式REPL 客户端sqlcmd如何获得查询执行的时间?

你可以在这里sp_BlitzErik他的回答中展示这一点,

SQL Server Execution Times:
  CPU time = 1859 ms,  elapsed time = 321 ms.
Run Code Online (Sandbox Code Playgroud)

benchmark linux client native-client sql-server-2017

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

当我们更改计算机日期/时间时,postgresql 的 uuid_generate_v1() 可能会发生冲突吗?

根据postgresql uuid-ossp文档uuid_generate_v1()是基于Mac地址+时间戳:

https://www.postgresql.org/docs/9.4/static/uuid-ossp.html

在分布式数据库场景中,我们有数百个数据库使用 UUID 键生成记录并同步回中央数据库。

假设我们检测到一台机器将来的日期/时间错误,我们将其改回正确的日期/时间。它可能会在此特定计算机上生成冲突的 UUID 密钥吗?

一种情况是夏令时/夏令时。

postgresql random time uuid

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

如何像在 MySQL 中一样查询 PostgreSQL 枚举?

在 MySQL 中使用下表:

CREATE TABLE bob(foo ENUM('a','b','c'));

INSERT INTO bob (foo) VALUES ('a'),('b'),('c'),('a'),('a');

SELECT * FROM bob WHERE foo >= 2;
+------+
| foo  |
+------+
| b    |
| c    |
+------+
Run Code Online (Sandbox Code Playgroud)

使用 PostGres 中的下表:

CREATE TYPE stuff AS ENUM ('a', 'b', 'c');
INSERT INTO bob (foo) VALUES ('a'), ('b'), ('b'), ('c'), ('c');
SELECT * FROM bob WHERE foo > 2;
(HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.) …
Run Code Online (Sandbox Code Playgroud)

postgresql enum where

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

PostgreSQL 将未定义的 JSONB 字段动态转换为一行

我有一个类型为字段的表jsonb,我想为所有 json 键拆分字段 jsonb 的列。此列缺少架构。例如:

CREATE TABLE v(id,jsonb)
  AS VALUES
    (1,'{"a":"4", "b":"5"}'::jsonb),
    (2,'{}'),
    (3,'{"a":"8", "c":"9", "d":"9"}');
Run Code Online (Sandbox Code Playgroud)

id  |  a   |   b   |  c  |  d

1   |  4   |   5   |     |  
3   |  8   |       |  9  |  9
Run Code Online (Sandbox Code Playgroud)

对于这种特定情况,一种解决方案是

select * from table, json_to_record(optional) as x("a" text, "b" text, "c" text, d text)
Run Code Online (Sandbox Code Playgroud)

如您所见,键可能会有所不同,并且在大型数据库中很难将所有键都放在我的实际问题中,我有 31 个键,另一方面,如果我想在其他表中重用此脚本,我必须手动填充键。

有没有办法在 jsonb 的所有键上进行选择而无需手动指定键?

postgresql select json

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

PostgreSQL:为什么 CREATE TABLE AS 比 CREATE ... INSERT INTO 快?

以下是同一事物的两种不同语法。

  1. 带有COPY TABLE AS SELECT( CTAS)。

    CREATE TABLE main
    AS
      SELECT *
      FROM other;
    
    Run Code Online (Sandbox Code Playgroud)
  2. 作为单独的语句CREATE TABLEINSERT INTO

    CREATE TABLE main (like other);
    
    INSERT INTO main
    SELECT *
    FROM other;
    
    Run Code Online (Sandbox Code Playgroud)

我观察到的CTAS比明显快CREATE TABLE.. INSERT。第一个需要 20 秒才能完成执行。第二个语法二需要 1 分 15 秒才能完成执行。

差异的原因可能是什么?

postgresql insert write-ahead-logging bulk-insert ctas

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

varchar(x) 与“text CHECK ( char_length(x) )”一样快吗?

在 Twitter 交流中西蒙·韦斯特 (Simon West)向布兰杜尔 (Brandur)询问,

\n\n
\n

出于兴趣,为什么使用email TEXT CHECK (char_length(email) <= 255)而不是email VARCHAR(255)?我以前没有见过这种模式

\n
\n\n

布兰杜尔回应说,

\n\n
\n

很好的问题!

\n\n

(1) VARCHAR 和 TEXT 在 Postgres 中的性能相同(请参阅https://www.postgresql.org/docs/current/static/datatype-character.html \xe2\x80\xa6中的“提示”框)。\n 。

\n\n

(2) 如果您想更改长度,ALTER TABLE则需要独占锁(请参阅https://www.postgresql.org/docs/current/static/sql-altertable.html \xe2\x80\xa6)。改变CHECK是即时的。\n 当回答一个引起质疑的问题时text CHECK (char_length(email) <= 255)vsvarchar(255)

\n
\n\n

这两个断言中的第一个断言(粗体)是否严格正确?

\n\n

如果对第二个主张感兴趣,请查看此问题

\n

postgresql varchar check-constraints

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

postgres 系统目录从表中查询列

我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 schema_information.tables,因为当我尝试以下脚本时:

SELECT table_name
FROM information_schema.tables
WHERE table_schema='{schema}'
Run Code Online (Sandbox Code Playgroud)

我得到 0 的回报,因为该用户没有权限,我应该这样做。

我正在尝试查询数据库以验证创建的表和列。我可以使用以下脚本通过系统目录获取表名列表:

SELECT tablename
FROM pg_catalog.pg_tables
WHERE schemaname = '{schema}'
Run Code Online (Sandbox Code Playgroud)

这会按照我想要的方式输出表名:

业务、位置、人员等...

我找不到带有系统目录的脚本,然后才能找到每个表的列名(作为奖励,数据类型)。到目前为止,我已经尝试了以下方法:

SELECT attname, format_type(atttypid, atttypmod) AS type
FROM pg_attribute
WHERE  attrelid = 'business'
Run Code Online (Sandbox Code Playgroud)

这是错误:

ERROR:  invalid input syntax for type oid: "business"
LINE 1: ...od) AS type FROM   pg_attribute WHERE  attrelid = 'business'
                                                         ^```
Run Code Online (Sandbox Code Playgroud)

还试过:

SELECT
    a.attname as "Column",
    pg_catalog.format_type(a.atttypid, a.atttypmod) as "Datatype"
FROM
    pg_catalog.pg_attribute a
WHERE
    a.attnum > 0
    AND NOT a.attisdropped
    AND …
Run Code Online (Sandbox Code Playgroud)

postgresql information-schema catalogs system-tables

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

如何在 PostgreSQL 中获取 regclass 类型表的模式名称?

在编写一个函数来测试表中是否col_name存在一列时_tbl,我想提取表的模式名称,该名称作为regclass参数传递给函数(为了安全??)。

CREATE OR REPLACE FUNCTION column_exists(_tbl regclass, col_name text)
  RETURNS bool AS
$func$
  SELECT EXISTS (
    SELECT 1 FROM information_schema.columns 
    WHERE table_schema=get_schema($1) 
      AND table_name=get_table($1) 
      AND column_name=$2
    );
$func$  LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

所以如果表名是'staging.my_table'::regclass,我想staging从一个虚构的函数中获取get_schema

我可以用 eg 来实现这个功能split_part(_tbl::text, '.', 1)吗?

此外,是否保证表名_tbl在转换为文本时始终具有模式名称?(即不省略诸如public.

我对这种regclass类型不是很熟悉。我搜索但找不到如何提取模式名称,只想在重新发明轮子之前先询问。

postgresql catalogs system-tables regclass

5
推荐指数
2
解决办法
9478
查看次数