小编use*_*760的帖子

在 PostgreSQL 中增量刷新物化视图

是否可以在 PostgreSQL 中增量刷新物化视图,即仅针对新的或已更改的数据?

考虑这个表和物化视图:

CREATE TABLE graph (
   xaxis integer NOT NULL,
   value integer NOT NULL,
);

CREATE MATERIALIZED VIEW graph_avg AS 
SELECT xaxis, AVG(value)
FROM graph
GROUP BY xaxis
Run Code Online (Sandbox Code Playgroud)

定期添加新值graph或更新现有值。我想graph_avg每隔几个小时刷新一次视图,仅针对已更新的值。但是在 PostgreSQL 9.3 中,整个表都被刷新了。这是相当耗时的。下一个版本 9.4 允许CONCURRENT更新但它仍然刷新整个视图。有数以百万计的行,这需要几分钟。

跟踪更新和新值并仅部分刷新视图的好方法是什么?

postgresql materialized-view postgresql-9.3 postgresql-9.4

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

修改 PostgreSQL 中的表约束

说我有一个约束

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
Run Code Online (Sandbox Code Playgroud)

需要修改,以便邮政编码长度为6.

我是否zipchk先删除约束然后重新创建它?

ALTER TABLE distributors DROP CONSTRAINT zipchk;
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 6);
Run Code Online (Sandbox Code Playgroud)

或者是否有MODIFY(类似)命令:

ALTER TABLE distributors MODIFY CONSTRAINT zipchk CHECK (char_length(zipcode) = 6);
Run Code Online (Sandbox Code Playgroud)

postgresql constraint

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

递归 CTE 以找到独特的 slug

我有一个文章表,我希望 slug 是独一无二的。

CREATE TABLE article (
   title char(50) NOT NULL,
   slug  char(50) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

当用户输入标题时,例如News on Apple,我想检查数据库以查看是否存在相应的 slug,例如news-on-apple。如果是这样,我将给一个数值添加后缀,直到找到一个唯一的值,例如news-on-apple-1. 可以通过递归 CTE 查询而不是在我的 ORM 中进行递归来实现。是否有一个很好的大概数字,我应该停止递归和出错。我可以想象人们使用相同的标题 1000 次,这将导致 1000 次查询只是为了创建 1 篇文章。

我对递归 CTE 的理解可能是不正确的,并且没有更好的方法来找到唯一的 slug。请提出任何替代方案。

postgresql database-design cte recursive

7
推荐指数
1
解决办法
1715
查看次数

了解多表连接与聚合

我有一个关于如何JOIN在多个表上工作的基本问题。我想计算link1&中外键的出现次数link2

CREATE TABLE main (
   id SERIAL PRIMARY KEY,
   name text NOT NULL
);

CREATE TABLE link1 (
   id SERIAL PRIMARY KEY,
   main_id integer NOT NULL,
   CONSTRAINT main_id_fk FOREIGN KEY (main_id) REFERENCES main (id)
);

-- link2 is similar to link1
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。

SELECT main.id, COUNT(link1.main_id) + COUNT(link2.main_id)
FROM main
LEFT JOIN link1 ON main.id=link1.main_id
LEFT JOIN link2 ON main.id=link2.main_id
GROUP BY main.id
Run Code Online (Sandbox Code Playgroud)

postgresql join aggregate

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

外键 NULL 与外键到空字符串

这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)

CREATE TABLE medicine (
   id serial PRIMARY KEY,
   name text NOT NULL,
   brand_id integer
   CONSTRAINT brand_fk FOREIGN KEY (brand_id) REFERENCES brand (id)       
);

CREATE TABLE brand (
  id serial PRIMARY KEY,
  name text NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

对于存储仿制药,例如abc& xyz,有两种选择:

  1. 使用 NULL 作为外键 brand_id

    INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
    INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)

  2. 在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id

    INSERT INTO brand (id, name) VALUES (1, '')
    INSERT INTO medicine (name, brand_id) VALUES …

postgresql foreign-key database-design unique-constraint

4
推荐指数
1
解决办法
7826
查看次数

列唯一性可以交换吗?

我在 Postgres 数据库中有一个表,其中col1col2是指同一列的外键。我只想要 的唯一组合(col1, col2),即如果(1,2)输入则(2,1)应该被拒绝。我怎样才能做到这一点?

我的表定义:

CREATE TABLE mytable (
    id serial primary key,
    col1 int NOT NULL,
    col2 int NOT NULL,
    unique (col1, col2)
)
Run Code Online (Sandbox Code Playgroud)

postgresql constraint unique-constraint

4
推荐指数
1
解决办法
335
查看次数

当需要具有运算符类的索引时,唯一索引是否比唯一约束更好

Postgres 文档说:

使用索引来强制唯一约束可以被视为不应直接访问的实现细节。但是,应该注意没有必要在唯一的列上手动创建索引;这样做只会复制自动创建的索引。

基于此,如果我想要一个列上的表达式索引并且还希望该列是唯一的,那么case 2下面会更好,因为它可以使用单个索引完成上述操作。而case 1由于唯一约束而自动创建一个索引,而另一个因为我需要小写索引而自动创建?

正如@Colin'tHart 指出的那样,这两种情况不一样。我应该在不使用lower()表达式的情况下发布这个问题。在那种情况下,我的理解是 aCREATE UNIQUE INDEX比唯一约束和简单索引更好。

基于此,如果我想要text_pattern_ops在列上使用运算符类(例如)的索引并且还希望该列是唯一的,那么case 2下面会更好,因为它可以使用单个索引完成上述操作。而case 1会因为唯一约束而自动创建一个索引,而另一个因为我需要不同的运算符类而自动创建?

情况1:

CREATE TABLE book (
   id SERIAL PRIMARY KEY,
   name text NOT NULL,
   CONSTRAINT book_name_key UNIQUE (name)
);

CREATE INDEX book_name_like ON book (name text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)

案例2:

CREATE TABLE book (
   id SERIAL PRIMARY KEY,
   name text NOT NULL
);

CREATE UNIQUE INDEX book_name_like ON book (name text_pattern_ops);
Run Code Online (Sandbox Code Playgroud)

postgresql index database-design unique-constraint

2
推荐指数
1
解决办法
2813
查看次数

PostgreSQL:避免多次对相同值进行 SUM

我有一个学生表和一个不同科目的分数表。我想将所有科目的每个学生的 score1 和 score2 相加,然后为每个学生加上奖金。

CREATE TABLE student (
   id serial PRIMARY KEY,
   name text NOT NULL,
   bonus integer NOT NULL,
);

CREATE TABLE score (
  id serial PRIMARY KEY,
  subject text NOT NULL,
  score1 integer NOT NULL,
  score2 integer NOT NULL,
  student_id integer NOT NULL,
  CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id),
);
Run Code Online (Sandbox Code Playgroud)

连接 score1 和 score2 的查询如下所示:

SELECT st.name, sum(sc.score1 + sc.score2) as total
FROM student st
LEFT JOIN score sc ON sc.student_id = st.id
group by …
Run Code Online (Sandbox Code Playgroud)

postgresql aggregate sum

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