是否可以在 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更新但它仍然刷新整个视图。有数以百万计的行,这需要几分钟。
跟踪更新和新值并仅部分刷新视图的好方法是什么?
说我有一个约束
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) 我有一个文章表,我希望 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。请提出任何替代方案。
我有一个关于如何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)
当两列中的计数都不为零时,为什么下面的查询会给出计数的乘积(而不是总和)。
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) 这是一个药品目录表。有些有药品品牌,有些是通用的(即他们永远不会有品牌信息)
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,有两种选择:
使用 NULL 作为外键 brand_id
INSERT INTO medicine (name, brand_id) VALUES ('abc', NULL)
INSERT INTO medicine (name, brand_id) VALUES ('xyz', NULL)
在品牌名称中仅插入 1 个空字符串,并将其用于所有仿制药的 Brand_id
INSERT INTO brand (id, name) VALUES (1, '')
INSERT INTO medicine (name, brand_id) VALUES …
我在 Postgres 数据库中有一个表,其中col1和col2是指同一列的外键。我只想要 的唯一组合(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) 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) 我有一个学生表和一个不同科目的分数表。我想将所有科目的每个学生的 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 ×8
aggregate ×2
constraint ×2
cte ×1
foreign-key ×1
index ×1
join ×1
recursive ×1
sum ×1