标签: postgresql

重命名表并将视图放在 Postgres 上的位置

我在我们的数据库中有一个非常重要的表,它被一系列应用程序使用,它附有规则、触发器和您可以想象的所有依赖项。现在我想修改表而不会对依赖项造成任何问题。我以前成功地执行了以下操作,但在一个不太复杂的情况下:

alter table reconciliations rename to matches;
create view reconciliations as select * from matches;
Run Code Online (Sandbox Code Playgroud)

这实现的是我现在可以修改新的“匹配”表,例如添加一列或多行,这些列或行不需要在“对帐”视图中显示(通过添加 where 子句来过滤它们)。

我使用的是 Postgres 9.5,因此视图可以自动更新。初步测试表明,这没有直接问题,所以我问这个问题是为了知道我应该寻找什么样的问题。性能不是大问题。

postgresql migration view

3
推荐指数
1
解决办法
1674
查看次数

不同“类型”的自动吸尘器有不同的性能特点吗?

在监视我的数据库上的 autovacuum 活动时,我注意到标记为 的 autovacuum(to prevent wraparound)似乎比“常规” autovacuum 花费的时间更长。这让我开始尝试了解各种“种类”或 autovacuum 的性能/行为差异。

文档中,我确定了 autovacuum 可能VACUUM是一张桌子的几个不同原因:

  1. 该表具有需要冻结的旧事务 ( relfrozenxid > min(autovacuum_freeze_max_age, table.autovacuum_freeze_max_age)。这就是“ (to prevent wraparound)”自动真空。

  2. 自上次以来表中过时的元组数VACUUM超过“真空阈值”

还有其他我想念的吗?

手册VACUUM中似乎暴露的“攻击性”旋钮是FREEZEDISABLE_PAGE_SKIPPING。这些不同类型的 autovacuum 是否曾经使用过这些选项,如果是,什么时候使用?

postgresql autovacuum

3
推荐指数
1
解决办法
630
查看次数

使用具有不同日期频率的两个表进行计算

我希望将一个表中的日期与另一个表中具有不同频率的日期对齐。我希望与低频表相关联的值在出现新日期之前重复,以便我可以对涉及两个表的数据进行计算。

为了促进这一点,我认为构建索引范围方案会很有用且更快。

这可能会更清楚...

让我们称之为daily表:

CREATE TEMP TABLE daily AS
SELECT date::date, val FROM ( VALUES
  ('2017-01-01',1),
  ('2017-01-02',2),
  ('2017-01-03',1),
  ('2017-01-04',56),
  ('2017-01-05',7),
  ('2017-01-06',6),
  ('2017-01-07',8),
  ('2017-01-08',6),
  ('2017-01-09',4),
  ('2017-01-10',4),
  ('2017-01-11',6),
  ('2017-01-12',8)
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)

这是low_fq(低频)表:

CREATE TEMP TABLE lowfq AS
SELECT date::date, val FROM ( VALUES
  ( '2017-01-02',700 ),
  ( '2017-01-06',100 ),
  ( '2017-01-08',200 ),
  ( '2017-01-12',500 )
) AS t(date,val);
Run Code Online (Sandbox Code Playgroud)

结果应该是这样的:

?????????????????????????????????????????????????????????????
?   dialy    ?     ?  ?   low_fq   ?      ?  ? low_fg/daily ?
?????????????????????????????????????????????????????????????
? date       ? val ? …
Run Code Online (Sandbox Code Playgroud)

postgresql timestamp

3
推荐指数
1
解决办法
348
查看次数

我应该将 JSONB 用于基于整数的数组吗?

我需要在每行的数组中存储一个 id 列表。我想使用 JSONB,然后将其存储为 : {ids: [1, 2, 3, 4]}。然后,我找到了Array类型,我可以用它直接将 id 存储到其中。问题是,我的案例推荐的数据类型是什么?

postgresql

3
推荐指数
1
解决办法
353
查看次数

在哪里可以找到 PostgreSQL 可用扩展的列表?

只是想知道是否有可用于 PostgreSQL 的扩展的官方列表?

postgresql postgresql-extensions

3
推荐指数
1
解决办法
7090
查看次数

仅在列 > 0 时限制“重复”

我有一个表,其中一fk列应该是唯一的,当另一int列是> 0. 如果这句话没有意义,以下是有效行的示例:

CREATE TABLE foo
AS
  SELECT fk,int
  FROM ( VALUES
    ( 1, -12 ),
    ( 1,  20 ),
    ( 1,   0 )
  ) AS (fk, int);
Run Code Online (Sandbox Code Playgroud)

向表中添加一个fk值为 的新行1和一int列是> 0无效的。

有没有办法用约束或索引来做到这一点?我觉得排除约束几乎让我到达那里,但我无法找到让它工作的方法。

我正在使用 Postgres 9.6.2。

postgresql constraint unique-constraint postgresql-9.6

3
推荐指数
1
解决办法
348
查看次数

使用 Postgres COPY TO 进行数据导出而不覆盖文件

我正在使用脚本和 psql 运行多个查询。我还使用 COPY TO 命令将结果导出到 a.csv。但是,当我想将结果附加到 a.csv 时,这会覆盖文件 a.csv。

是否可以使用 COPY TO 语法,也许我缺少一些参数?还是我应该考虑使用其他工具?

postgresql export psql

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

将列添加到现有表是不好的做法吗?

相反:在创建新表时获取所有列是否更好?

我正在开发一个新系统,而且新的要求一直在出现。最新的要求是为每个客户添加一个新的标签字段,以便更容易在新旧系统之间关联数据。新系统尚未投入生产,但已经完成了迁移过程的一些测试运行。

目前,删除表并重新运行批量加载仍然可行,但未来如何 - 当系统中有大量实时数据并且出现对新列的需求时:它对例如,要导出数据,重新创建包含所有列的表,然后再次导入数据,而不仅仅是执行 ALTER TABLE ADD 列......?

如果它有任何不同,该解决方案基于 PostgreSQL 9.5,如果它确实有所不同,那么了解哪些 DBMS 或多或少关心会很有趣。

是否在此列上创建索引会影响答案?例如,当设置了唯一约束时。

postgresql database-design alter-table

3
推荐指数
1
解决办法
6093
查看次数

是否 || 如果其中一列为空白,Postgres 中的运算符会导致空白结果吗?

我在 Postgres 中使用||运算符连接一些列运行查询,似乎其中一列为空,整个结果为空。这是正常||行为吗?

我的意思是“空白” NULL

postgresql operator

3
推荐指数
1
解决办法
584
查看次数

主键保证:重复和无效

Oracle 允许主键具有重复值和空值。使用此功能并不是一个特别好的主意,但它意味着大多数开发人员认为主键的某些保证(非空、唯一)并不是真正的保证。

CREATE TABLE oracle_guarantees (
    ID NUMBER(9,0),
    NAME VARCHAR2(50 BYTE),
    breed NVARCHAR2(100)
);

INSERT INTO oracle_guarantees VALUES (1, 'Fuzz Head', 'Tabby');
INSERT INTO oracle_guarantees VALUES (2, 'Fluffy Thing', 'Mix');
INSERT INTO oracle_guarantees VALUES (2, 'Fluffy Thing', 'Mix');
INSERT INTO oracle_guarantees VALUES (3, 'Tiger', 'Tabby');
INSERT INTO oracle_guarantees VALUES (4, 'Fur Beast', 'Bengal');
INSERT INTO oracle_guarantees VALUES (5, 'Karate', 'Japanese Bobtail');
INSERT INTO oracle_guarantees VALUES (6, 'Chairman Meow', 'Chinese Harlequin');
INSERT INTO oracle_guarantees VALUES (NULL, 'No Cat', 'No breed');

CREATE …
Run Code Online (Sandbox Code Playgroud)

postgresql sqlite oracle sql-server

3
推荐指数
1
解决办法
1998
查看次数