Postgres 10 获得了使用国际组件进行 Unicode (ICU)排序的能力,而不是依赖于主机操作系统的实现。请参阅Peter Eisentraut在 PostgreSQL 10 中使用 ICU 支持的更强大的排序规则。
那么在创建数据库时究竟如何指定 ICU 排序规则呢?
我确实在CREATE DATABASEto use 中阅读了一个提示,template0而不是template1iftemplate1可能是使用编码和整理而不是您想要的新数据库创建的。并且在使用时template0,您需要启用数据连接以覆盖默认值。
我在 Postgres 10 doc page for Collation Support中读到:
und-x-icu(用于“未定义”)
ICU“根”整理。使用它来获得合理的与语言无关的排序顺序。
因此,und-x-icu在建立包含多语言文本的新数据库时,这似乎是一个很好的使用价值。当已知某种语言专注于特定语言时,该SELECT命令可以指定另一种排序规则,例如 German de-x-icu。否则,回退到默认值und-x-icu。
所以我尝试了以下 SQL 在 Postgres 10 Beta 2 中创建一个数据库。
CREATE DATABASE timepiece_
TEMPLATE 'template0'
ALLOW_CONNECTIONS TRUE
CONNECTION LIMIT -1
ENCODING 'UTF8'
LC_COLLATE 'und-x-icu'
LC_CTYPE 'und-x-icu'
;
Run Code Online (Sandbox Code Playgroud)
失败并出现错误:
[42809] …
postgresql collation postgresql-10 international-components-unicode
标题说明了一切……如何从 macOS 计算机中完全删除 Postgres 集群?
我用提供的安装应用程序通过EnterpriseDB公司为尊重社会。
此卸载问题已在 Stack Overflow 上被多次询问。但这些问题和答案已经过时多年。
PostgreSQL 10 在 Ubuntu 17.10 上可用吗?
我检查了 APT 上的文件夹是否确实存在:http : //apt.postgresql.org/pub/repos/apt/dists/artful-pgdg/10/
但是在我这样做之后:
sudo add-apt-repository "deb http://apt.postgresql.org/pub/repos/apt/ artful-pgdg main"
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install postgresql-10
Run Code Online (Sandbox Code Playgroud)
我收到一个错误:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package postgresql-10
Run Code Online (Sandbox Code Playgroud)
上述步骤适用于 Ubuntu 16.04(带有xenial-pgdg),但不适用于 17.10。
任何指针?
我正在尝试使用 PostgreSQL 10 的新分区方法。我有一个包含 150 万行的父表。我想在这个已经填充的表上创建分区。
我创建了一个 新的主表,它与CREATE SCRIPT 中的真实主表具有相同的列;
CREATE TABLE master_part (objectid integer,poly geometry(Geometry,2321), parcel character varying(255), m_date(date)) PARTITION BY RANGE (m_date);
Run Code Online (Sandbox Code Playgroud)
然后我创建了子表,由 m_date 列分区;
CREATE TABLE parsel_2014_04
PARTITION OF parsel_part FOR VALUES FROM ('2014-04-01') TO ('2014-04-30');
CREATE TABLE parsel_2014_05
PARTITION OF parsel_part FOR VALUES FROM ('2014-05-01') TO ('2014-05-31');
CREATE TABLE parsel_2014_06
PARTITION OF parsel_part FOR VALUES FROM ('2014-06-01') TO ('2014-06-30');
CREATE TABLE parsel_2014_07
PARTITION OF parsel_part FOR VALUES FROM ('2014-07-01') TO ('2014-07-31');
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 我一直在玩弄 Postgres 10 逻辑复制,试图了解它并可能将它应用到几个项目中。我观察到了一些我想知道的事情,但我不确定我是否知道足够的术语来正确搜索答案。考虑以下:
我有两台运行 postgres 的机器,它们可以相互访问,并且我有从机器 1(发布者)到机器 2(订阅者)的逻辑复制。然而,我希望改变这种关系——我想让 2 个发布者和 1 个订阅者。
我在它们各自的机器上删除订阅和发布,并在相反的机器上创建它们,所以现在 2 有一个发布,1 有订阅。一切似乎只是花花公子。
问题是,当我在 2 上插入一些东西时,它没有发布到 1。订阅/发布配置正确,似乎正在接收彼此的消息。
我玩了一会儿,发现如果我将要复制的表从 2 截断到 1,那么复制会准确地按预期恢复。这似乎是一个问题。我正在执行此操作的数据库非常小,只有 8 个条目,因此截断表并重新加载它不是问题。但是没有这个可以恢复复制吗?
假设我在初始化发布/复制时可以保证两台机器上的两个表具有完全相同的数据,那么它是否可以正常运行而不必截断订阅者节点上的表?
我有一个包含一些行的表,我尝试使用以下命令添加一个标识列:
ALTER TABLE sourceTable
ADD COLUMN ogc_fid int
GENERATED BY DEFAULT AS IDENTITY;
Run Code Online (Sandbox Code Playgroud)
建议使用上面的命令来回答这个问题:
但我得到:
错误:“ogc_fid”列包含空值
SQL 状态:23502
看起来表的现有行没有自动生成标识,但会导致此错误(如果表没有行,该命令可以正常工作)。有任何想法吗?我是否必须首先为我添加的列生成值DEFAULT nextval('some_sequence')?或者在 PostgreSQL 10 中有更好的方法吗?
我prices在 PostgreSQL 10 DB 中有一个时间序列表。
这是一个简化的测试用例来说明问题:
CREATE TABLE prices (
currency text NOT NULL,
side boolean NOT NULL,
price numeric NOT NULL,
ts timestamptz NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
我想快速查询每个currency/side双人组的最后一个值,因为这会给我每种货币的当前买入/卖出价格。
我目前的解决方案是:
create index on prices (currency, side, ts desc);
select distinct on (currency, side) *
order by currency, side, ts desc;
Run Code Online (Sandbox Code Playgroud)
但这会让我在这个只有 ~30k 行的表中查询非常慢(~500ms)。
在实际的表都有,我想组四列而不是两个。下面是实际的表和查询的样子:
create table prices (
exchange integer not null,
pair text not null,
side …Run Code Online (Sandbox Code Playgroud) postgresql performance index-tuning greatest-n-per-group postgresql-10 postgresql-performance
我想弄清楚是否有一种方法可以使嵌套 CTE 适用于这种特殊情况。
考虑以下基于实际应用程序的(高度人为设计的)场景:有一个员工 ID 的单列表。然后是包含所有详细信息的员工属性表。(单列表背后的主要原因通常是理所当然地需要在知道实际员工的任何详细信息之前批量创建和分配新员工 ID。)
现在到手头的任务,我们要为新员工插入详细信息(即姓名),但首先我们需要检查是否已经存在具有该姓名的员工。如果是,我们将简单地返回 id,如果不是,我们将创建一个新的员工记录,然后插入详细信息,最后返回新创建的 id。
要重新创建此测试场景:
CREATE TABLE public.employee (
id text DEFAULT gen_random_uuid(),
PRIMARY KEY (id)
);
CREATE TABLE public.employee_details (
employee_id text,
name text,
PRIMARY KEY (employee_id),
FOREIGN KEY (employee_id) REFERENCES public.employee(id)
);
Run Code Online (Sandbox Code Playgroud)
我试图敲定的查询如下所示。
with
e as
(select name, employee_id from employee_details where name = 'jack bauer'),
i as (insert into employee_details (name, employee_id)
select 'jack bauer',
(with a as (insert into employee values(default) RETURNING id) select a.id from a)
where not exists …Run Code Online (Sandbox Code Playgroud) 给定一个数据集(GIN索引为values):
key | values
-------------
1 | {4,2,1}
1 | {2,5}
2 | {4,1,3}
Run Code Online (Sandbox Code Playgroud)
我想聚合数组:
key | values
-------------
1 | {4,2,1,5}
2 | {4,1,3}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法不起作用:
SELECT key, array_agg(DISTINCT unnest(values)) AS values FROM data GROUP BY key
Run Code Online (Sandbox Code Playgroud)
[0A000] 错误:聚合函数调用不能包含返回集合的函数调用
提示:您可以将返回集合的函数移动到 LATERAL FROM 项中。
不熟悉LATERAL FROM,对我来说如何实现所需的输出并不明显。
我正在设计一个过程来测试我的 postgresql 10.8 备份,方法是将它们恢复到一次性虚拟机中的随机时间点。不过,我一直无法完全自动化该过程。我在官方文档的第 8 步(第 25.3.4 节)被阻止
- 启动服务器。
执行pg_ctl startover ssh 时,命令会挂起,直到被杀死。如果我直接通过 ssh 连接到 VM 并执行pg_ctl start,则命令会按预期快速返回。
2012 年的这个帖子似乎描述了一个类似的场景。在我的情况,不过Postgres的过程也即使当它是挂呼叫会话被杀死成功启动(可能是9.0.5和10.8之间虽然有所改善?)。
这个 github 问题似乎相关,但遗憾的是,通过用一种我不知道的语言进行了长时间的重写“解决了”,并最终得出结论,它是pg_ctl二进制文件中的一个错误。
如何自动执行第 8 步,以便我可以继续对备份媒体进行后续验证测试?
这是我需要破解的二进制文件中的一个突出错误吗?或者我错过了一个明智的实施?
postgresql-10 ×10
postgresql ×8
aggregate ×1
alter-table ×1
array ×1
collation ×1
cte ×1
identity ×1
index-tuning ×1
insert ×1
international-components-unicode ×1
mac-os-x ×1
partitioning ×1
performance ×1
replication ×1
restore ×1
ssh ×1
ubuntu ×1