Questions tagged «postgresql-9.5»

专门针对PostgreSQL 9.5版

1
PostgreSQL DELETE FROM失败,并显示“错误:尝试删除不可见的元组”
此问题是从“服务器故障” 迁移而来的,因为可以在数据库管理员堆栈交换中回答。 迁移 3年前。 错误 尝试删除包含无效时间戳记的元组 DELETE FROM comments WHERE date > '1 Jan 9999' OR date < '1 Jan 2000' OR date_found > '1 Jan 9999' OR date_found < '1 Jan 2000'; 结束于 ERROR: attempted to delete invisible tuple 有从2009年的邮件列表讨论完全相同的错误信息,其中OP有它固定的,但我没有发现他是如何做到的或可能是什么导致了这种错误的解释。 由于缺乏对Google的欢迎以及对PostgreSQL的了解有限,我感到无助。 导致腐败的原因 当OS内核崩溃时,我有一个在Debian 8上运行的PostgreSQL 9.5.5服务器(〜4TB数据,所有默认设置,除了增加的内存限制)–大概是在重建交换所在的/ dev / md1时。在此之前,PostgreSQL用400GB的日志文件吞噬了几乎所有磁盘空间。操作系统再也不会启动,磁盘检查还可以,所以我已经从LiveCD启动,并将每个块设备备份到了映像,以防万一。我已经成功地从/ dev …

2
如何在upsert中获取冲突行的ID?
我有一个tag包含2列的表格:id(uuid)和name(text)。现在,我想在表中插入一个新标签,但是如果该标签已经存在,我只想获取id现有记录的。 我以为我可以ON CONFLICT DO NOTHING结合使用RETURNING "id": INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT DO NOTHING RETURNING "id"; 但是,如果名称“ foo”的标记已存在,则返回空结果集。 然后,我将查询更改为使用noop DO UPDATE子句: INSERT INTO "tag" ("name") VALUES( 'foo' ) ON CONFLICT ("name") DO UPDATE SET "name" = 'foo' RETURNING "id"; 这可以按预期工作,但是有些混乱,因为我只是将名称设置为已经存在的值。 这是解决此问题的方法,还是我缺少一种更简单的方法?


1
Postgres:SET NOT NULL如何比CHECK约束“更有效”
在PostgreSQL文档Constraints中,它说 非空约束在功能上等同于创建检查约束CHECK (column_name IS NOT NULL),但是在PostgreSQL中,创建显式非空约束更为有效。 我很好奇 “更有效”到底是什么意思? 使用CHECK (column_name IS NOT NULL)代替的不利之处是SET NOT NULL什么? 我希望能够添加一个NOT VALID CHECK约束并分别对其进行验证(因此,AccessExclusiveLock对于添加约束,该约束仅保留很短的时间,然后ShareUpdateExclusiveLock对于较长的验证步骤,将其保持一段时间): ALTER TABLE table_name ADD CONSTRAINT column_constraint CHECK (column_name IS NOT NULL) NOT VALID; ALTER TABLE table_name VALIDATE CONSTRAINT column_constraint; 代替: ALTER TABLE table_name ALTER COLUMN column_name SET NOT NULL;

1
为什么时区在Postgres的0001年有如此疯狂的UTC偏移量?
在Postgres 9.5中,我很惊讶地看到下面的年份在尝试年份0001(没有年份0 0000)时看到。 偏移量-07:52:58? 一些示例代码。请注意,我混合使用TIMESTAMP WITH TIME ZONE和TIMESTAMP WITHOUT TIME ZONE,因此请仔细阅读。 SET TIME ZONE 'America/Los_Angeles' ; SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ; ("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00") 我对第二个值感到惊讶:0001-12-31 16:07:02-07:52:58 BC。我知道我们必须向后退8 America/Los_Angeles个小时,比UTC 落后8个小时,但要相差-08:00。但不是-08:00偏移量是-07:52:58。为什么? UTC下没问题 在UTC下输入数据时没有这种问题。 SET TIME …

1
了解postgresql.conf文件中的“ max_wal_size”和“ min_wal_size”参数默认值
根据文档min_wal_size和max_wal_size参数,默认值为: 对于max_wal_size:The default is 1 GB 对于min_wal_size:The default is 80 MB 然后,从数据库配置中查看以下参数: select name, setting, unit from pg_settings where name in ('min_wal_size', 'max_wal_size') 给出结果: name | setting | unit ---------------------------------- max_wal_size | 64 | min_wal_size | 5 | 我有两个问题: 1)为什么这些值与docs中显示的默认值不匹配?我根本没有更改配置设置。 2)为什么unit这些参数的列为空/ NULL?在这种情况下,什么是64和5值?MB?GB?还是什么? work_mem当一切都清楚后,为什么这不像示例 参数: name | setting | unit ---------------------------------- …

1
psql 9.5:gen_random_uuid()不起作用
SELECT gen_random_uuid() 产生输出 ERROR: function gen_random_uuid() does not exist SQL state: 42883 Hint: No function matches the given name and argument types. You might need to add explicit type casts. 我CREATE EXTENSION pgcrypto;在选定的数据库上运行并且SELECT gen_random_bytes(1)运行完美(gen_random_bytes不适用于pgcrypto未手动创建扩展名的其他数据库)。 % psql --version psql (PostgreSQL) 9.5.3 Ubuntu版本是16.04。

3
如何在PL / pgSQL中返回多行记录
我正在尝试使用RECORD数据类型返回多个记录,有没有一种方法可以追加到RECORD并在每次迭代中向此RECORD添加/附加新值。 也就是说,我想附加到,rec以便rec在循环结束时成为一组行,我可以在函数末尾返回。目前,我正在这样做- SELECT temp_table.col1, temp_table.col2, temp_table.col3 INTO rec FROM temp_table WHERE temp_table.col3 = false; 我的完整代码在这里: CREATE OR REPLACE FUNCTION validation() RETURNS RECORD AS $$ DECLARE rec RECORD; temp_row RECORD; BEGIN CREATE TEMPORARY TABLE temp_table (col1 TEXT, col2 INTEGER, col3 BOOLEAN) ON COMMIT DROP; FOR temp_row IN SELECT * FROM staging.validation …

1
在PostgreSQL中查询JSONB
我有一个表,persons其中包含两列,一个id和一个基于JSONB的data列(此表仅出于演示目的而制作,可以与PostgreSQL的JSON支持一起使用)。 现在,假设它包含两个记录: 1, { name: 'John', age: 30 } 2, { name: 'Jane', age: 20 } 现在,假设我想获得每个25岁以上的人的名字。我尝试过的是: select data->'name' as name from persons where data->'age' > 25 不幸的是,这会导致错误。我可以使用->>代替来解决它->,但是比较不会再按预期进行,因为不是比较数字,而是将它们表示为字符串: select data->'name' as name from persons where data->>'age' > '25' 然后,我发现实际上可以使用->和强制转换为解决此问题int: select data->'name' as name from persons where cast(data->'age' as int) > …

4
删除Postgres数据库中的所有数据
我已经使用--data-only和--column-inserts标志从生产服务器上创建了一个新的数据库转储,因此在暂存服务器上执行还原时,我只有一堆插入语句可插入数据。 pg_dump -h localhost -U adminuser --data-only --column-inserts maindb > maindb.sql 从生产转储中还原数据之前,如何先删除登台服务器数据库中的所有数据? 我只想删除所有数据,所以不必删除和创建数据库以及所有其他东西。我只想删除数据并插入所有新数据。 由于多种原因,我没有选择删除和​​创建数据库的选项。我将必须删除所有数据并仅插入,因此无论如何查找该方法,我都愿意这样做,但是显然需要帮助。 我还需要自动执行此过程。将自动执行“从生产数据库中转储数据”,然后“在暂存数据库上删除数据”,然后“将数据还原到暂存数据库”。我只需要“在登台数据库上删除数据”部分的帮助。 我在PostgreSQL 9.5.2上运行

2
PostgreSQL UPSERT问题与NULL值
我在使用Postgres 9.5中的新UPSERT功能时遇到问题 我有一个表,用于汇总来自另一个表的数据。复合键由20列组成,其中10列可以为空。下面,我为我遇到的问题创建了一个较小的版本,尤其是NULL值。 CREATE TABLE public.test_upsert ( upsert_id serial, name character varying(32) NOT NULL, status integer NOT NULL, test_field text, identifier character varying(255), count integer, CONSTRAINT upsert_id_pkey PRIMARY KEY (upsert_id), CONSTRAINT test_upsert_name_status_test_field_key UNIQUE (name, status, test_field) ); 根据需要运行此查询(首先插入,然后随后的插入仅增加计数): INSERT INTO test_upsert as tu(name,status,test_field,identifier, count) VALUES ('shaun',1,'test value','ident', 1) ON CONFLICT …

1
Windows 10秋季更新后,PostgreSQL 9.5无法启动
我已经安装了Windows 10 Fall更新(1709),现在我的PostgreSQL 9.5服务器无法启动。它昨天在更新之前有效,并且我没有对配置进行任何更改。 我检查了事件查看器,发现以下错误消息: 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_monetary": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_numeric": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST LOG: invalid value for parameter "lc_time": "Czech_Czech Republic.1250" 2017-10-19 11:32:32 CEST FATAL: configuration file "C:/Program Files/PostgreSQL/9.5/data/postgresql.conf" contains errors 似乎Microsoft随着Fall更新更改了语言环境名称,我找不到可用的语言环境名称的任何列表,因此我决定安装Postgres 10,它证实了我的怀疑,Postgres …

2
约束-一个布尔行为true,所有其他行为false
我有一列: standard BOOLEAN NOT NULL 我想强制执行True,其余所有都设置为False。根据此约束,没有FK或其他任何内容。我知道我可以用plpgsql完成它,但这似乎像是一把大锤。我更喜欢a CHECK或UNIQUE约束。越简单越好。 一行必须为True,不能全部为False(因此,插入的第一行必须为True)。 该行将需要更新,这意味着我必须等待检查约束,直到更新完成,因为所有行都可能先设置为False,然后再设置为True。 products.tax_rate_id和之间有一个FK tax_rate.id,但与默认税率或标准税率无关,用户可以选择默认税率或标准税率来轻松创建新产品。 PostgreSQL 9.5(如果重要)。 背景 该表是税率。税率之一是默认税率(standard因为默认税率是Postgres命令)。添加新产品时,将对产品应用标准税率。如果没有standard,则数据库必须进行猜测或进行各种不必要的检查。我认为,简单的解决方案是确保存在standard。 上面的“默认”是指表示层(UI)。有一个用于更改默认税率的用户选项。我或者需要添加额外的检查以确保GUI /用户不会尝试将tax_rate_id设置为NULL,或者只是设置默认税率。

1
事务ID换行后,如何比较xmin和txid_current()?
除其常规列外,Postgres表还具有各种可用的系统列。其中一个xmin存储用于创建行的事务ID。它的数据类型是xid,一个四字节整数,在某个点回绕(即不一定唯一)。该函数txid_current()依次返回当前事务ID,但返回as bigint,因为它“用“ epoch”计数器扩展,因此在安装期间不会回绕”(引用手册)。 如果尚未发生事务折回,则两个值似乎匹配: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) 但是我想知道:这两个值是否总是可比的?据我了解,txid_current()在交易ID换行后(最多2 ^ 32个交易),将继续提供唯一的值,并且xmin将从零开始。这意味着两者都开始在那个时候返回不同的值? 如果是这样,是否有一种方法可以提取结果的常规xid值txid_current(),使其与xmin表中的条目匹配(例如,转换txid_current()为整数)? 编辑:更加清楚地表明,我关心在事务ID换行之后会发生什么,这很可能在2 ^ 32个事务之前发生。感谢DanielVérité在评论中指出这一点。

1
postgres_fdw性能慢
以下针对外部对象的查询大约需要5秒钟才能在320万行上执行: SELECT x."IncidentTypeCode", COUNT(x."IncidentTypeCode") FROM "IntterraNearRealTimeUnitReflexes300sForeign" x WHERE x."IncidentDateTime" >= '05/01/2016' GROUP BY x."IncidentTypeCode" ORDER BY 1; 当我在普通表上执行相同的查询时,它将在0.6秒内返回。执行计划完全不同: 普通表 Sort (cost=226861.20..226861.21 rows=4 width=4) (actual time=646.447..646.448 rows=7 loops=1) Sort Key: "IncidentTypeCode" Sort Method: quicksort Memory: 25kB -> HashAggregate (cost=226861.12..226861.16 rows=4 width=4) (actual time=646.433..646.434 rows=7 loops=1) Group Key: "IncidentTypeCode" -> Bitmap Heap …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.