小编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
查看次数

MariaDB 或 MySQL 是否实现了 VALUES(表达式)表值构造函数?

我只是想知道 MariaDB 或 MySQL 是否<table value constructor>在 SQL 规范中实现了。在SQL ServerPostgreSQL 中,这是通过标准化的VALUES (expression)?

SELECT *
FROM ( VALUES (1) ) AS t(x);
 x 
---
 1
(1 row)
Run Code Online (Sandbox Code Playgroud)

(来自语法)。

mysql mariadb sql-standard mariadb-10.3

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

支持或记录 PostgreSQL 谓词“IS OF”和“IS NOT OF”?

回顾 PostgreSQL 的一些回归测试,我可以看到

SELECT x, x IS OF (text) AS is_text FROM q;
Run Code Online (Sandbox Code Playgroud)

这显然可以追溯到7.3

添加 IS OF / IS NOT OF 类型谓词 (Thomas)

是否支持这种形式。在我自己的代码中,我会写,

pg_typeof(x) = 'text'
Run Code Online (Sandbox Code Playgroud)

但我IS OF更喜欢。

postgresql

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

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
查看次数

一对多字典(查找)表 vs varchar vs enum?

假设我们有订单表,并且订单有状态。这三个选项中哪一个最好?

  1. 用于varchar状态栏
  2. 用于enum状态栏
  3. 使用单独的状态表,其中有status_id intname varchar,并且在订单表中保留status_id作为外键。

哪种方法是最好的?int我怀疑使用字典表也更好,因为通过, 而不是 来搜索状态会更快varchar

mysql database-design enum

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

在 SQL Server 2017 (Linux) 上,资源数据库保存在何处(位于磁盘上)?

在我在 Linux 上默认安装的 SQL Server 2017 中,/var/opt/mssql/data我看到以下数据库,

  • master.mdf- master 数据库- 记录 SQL Server 实例的所有系统级信息。
  • model.mdf-模型数据库- 用作在 SQL Server 实例上创建的所有数据库的模板。对模型数据库所做的修改,例如数据库大小、排序规则、恢复模型和其他数据库选项,将应用于之后创建的任何数据库。
  • msdbdata.mdf- msdb 数据库- SQL Server 代理使用它来安排警报和作业。
  • tempdb.mdf- tempdb 数据库- 是用于保存临时对象或中间结果集的工作区。

所有这些数据库实际上都有很好的文档记录。然而,我的安装对资源数据库的遗漏很突出。Resource Database 的描述似乎表明它是自己的数据库,

资源数据库是一个只读数据库,其中包含 SQL Server 附带的所有系统对象。SQL Server 系统对象(例如 sys.objects)在物理上持久保存在 Resource 数据库中,但它们在逻辑上出现在每个数据库的 sys 架构中。资源数据库不包含用户数据或用户元数据。

更令人困惑的是,对于SQL Server 2012,文档说,(不是 2017,这是我正在运行的)

资源的物理性质

Resource 数据库的物理文件名是 mssqlsystemresource.mdf 和 mssqlsystemresource.ldf。这些文件位于<drive>:\Program Files\Microsoft SQL Server\MSSQL11.<instance_name>\MSSQL\Binn\. 每个 SQL Server …

sql-server linux database-internals sql-server-2017

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