我有一张表,用于存储两个人之间的对话。
数据将如下所示:
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列创建索引?
我似乎无法使用我的数据库在 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 并且是数据库的正确导出。
运行 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) 根据postgresql uuid-ossp文档uuid_generate_v1()是基于Mac地址+时间戳:
https://www.postgresql.org/docs/9.4/static/uuid-ossp.html
在分布式数据库场景中,我们有数百个数据库使用 UUID 键生成记录并同步回中央数据库。
假设我们检测到一台机器将来的日期/时间错误,我们将其改回正确的日期/时间。它可能会在此特定计算机上生成冲突的 UUID 密钥吗?
一种情况是夏令时/夏令时。
在 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) 我有一个类型为字段的表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 的所有键上进行选择而无需手动指定键?
以下是同一事物的两种不同语法。
带有COPY TABLE AS SELECT( CTAS)。
CREATE TABLE main
AS
SELECT *
FROM other;
Run Code Online (Sandbox Code Playgroud)作为单独的语句CREATE TABLE和INSERT 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 秒才能完成执行。
差异的原因可能是什么?
在 Twitter 交流中,西蒙·韦斯特 (Simon West)向布兰杜尔 (Brandur)询问,
\n\n\n\n\n出于兴趣,为什么使用
\nemail TEXT CHECK (char_length(email) <= 255)而不是email VARCHAR(255)?我以前没有见过这种模式
布兰杜尔回应说,
\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) 如果您想更改长度,
\nALTER 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我正在针对为用户提供数据库的应用程序构建集成测试。为其创建的用户不是超级用户,并且无权访问 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) 在编写一个函数来测试表中是否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类型不是很熟悉。我搜索但找不到如何提取模式名称,只想在重新发明轮子之前先询问。