来自文档- 37.3.1.1。“循序渐进的第一条规则”
CREATE TABLE shoelace_log (
sl_name text, -- shoelace changed
sl_avail integer, -- new available value
log_who text, -- who did it
log_when timestamp -- when
);
CREATE RULE log_shoelace AS ON UPDATE TO shoelace_data
WHERE NEW.sl_avail <> OLD.sl_avail
DO INSERT INTO shoelace_log VALUES (
NEW.sl_name,
NEW.sl_avail,
current_user,
current_timestamp
);
Run Code Online (Sandbox Code Playgroud)
现在有人这样做:
(1) UPDATE shoelace_data SET sl_avail = 6 WHERE sl_name = 'sl7';
Run Code Online (Sandbox Code Playgroud)
解析器生成这个额外的查询
(2) INSERT INTO shoelace_log VALUES (
shoelace_data.sl_name, 6,
current_user, current_timestamp )
FROM shoelace_data
WHERE …Run Code Online (Sandbox Code Playgroud) 我必须将 .pdf 文件存储在表格中。
我有一个表,state列:
id_state,
name,
pdffile (bytea)
Run Code Online (Sandbox Code Playgroud)
我想将 pdf 文件存储在 pdffile 列中。
我怎样才能做到这一点?
考虑:
with days as (select day::date
from generate_series(date '2013-01-01', date '2013-01-01' + 365, interval '1 day' day) day
)
select 'Inspections'::text as data_label,
count(i.reporting_id) as daily_count, d.day as date_column
from days d
left join inspection i on i.close_case_date = d.day
group by d.day
order by d.day
Run Code Online (Sandbox Code Playgroud)
这将返回一个如下所示的集合:
data_label | daily_count | date_column
Inspections 1 01/01/13
Inspections 2 01/02/13
Inspections 4 01/04/13
Inspections 8 01/06/13
Run Code Online (Sandbox Code Playgroud)
请注意记录集中的 1 天和 2 天间隔。我需要生成一个用 0 填充的值的集合,如下所示:
data_label | daily_count | date_column
Inspections 1 01/01/13
Inspections …Run Code Online (Sandbox Code Playgroud) 我有一个 PostgreSQL 9.3 表,其中包含一些数字和一些附加数据:
CREATE TABLE mytable (
myid BIGINT,
somedata BYTEA
)
Run Code Online (Sandbox Code Playgroud)
该表目前有大约 10M 条记录,占用 1GB 磁盘空间。myid不连续。
我想计算 100000 个连续数字的每个块中有多少行:
SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000;
Run Code Online (Sandbox Code Playgroud)
这将返回大约 3500 行。
我注意到某个索引的存在显着加快了这个查询,即使查询计划根本没有提到它。没有索引的查询计划:
db=> EXPLAIN (ANALYZE TRUE, VERBOSE TRUE) SELECT myid/100000 AS block, count(*) AS total FROM mytable GROUP BY myid/100000;
QUERY PLAN
----------------------------------------------------------------------------------------------------------------------------------------
GroupAggregate (cost=1636639.92..1709958.65 rows=496942 width=8) (actual time=6783.763..8888.841 rows=3460 loops=1)
Output: ((myid / 100000)), count(*)
-> Sort (cost=1636639.92..1659008.91 rows=8947594 width=8) (actual time=6783.752..8005.831 …Run Code Online (Sandbox Code Playgroud) 我有一个带有用户表的 heroku postgres 附加数据库。但是,当我尝试时select * from user,我得到的只是:
current_user
----------------
rtsjlhdfptlaqd
(1 row)
Run Code Online (Sandbox Code Playgroud)
表名肯定是user. 没有users桌子。我的应用程序中肯定有很多用户,但我似乎无法列出它们。
想法?
为什么 PostgreSQL 返回 't' 和 'f' 而不是 TRUE 和 FALSE?
该文档本身的建议我们将布尔值或进行比较时使用的真与假,但选择从数据库中的值时,返回不同的价值观。
CREATE TABLE test1 (a boolean, b text);
INSERT INTO test1 VALUES (TRUE, 'sic est');
INSERT INTO test1 VALUES (FALSE, 'non est');
SELECT * FROM test1;
a | b
---+---------
t | sic est
f | non est
Run Code Online (Sandbox Code Playgroud)
这种行为有原因吗?PostgreSQL 社区有没有尝试过改变它?
我有一个containers可以与多个表建立多对多关系的表,假设它们是plants,animals和bacteria。每个容器可以包含任意数量的植物、动物或细菌,并且每个植物、动物或细菌可以在任意数量的容器中。
到目前为止,这非常简单,但我遇到的问题是每个容器应该只包含相同类型的元素。例如,同时包含植物和动物的混合容器应该是数据库中的约束违规。
我的原始架构如下:
containers
----------
id
...
...
containers_plants
-----------------
container_id
plant_id
containers_animals
------------------
container_id
animal_id
containers_bacteria
-------------------
container_id
bacterium_id
Run Code Online (Sandbox Code Playgroud)
但是对于这个模式,我无法想出如何实现容器应该是同构的约束。
有没有办法通过参照完整性来实现这一点,并在数据库级别确保容器是同类的?
我为此使用 Postgres 9.6。
我有一个 linux 用户帐户、postgresql 角色和关联的数据库,都称为 foo。
从 linux 用户 foo,我运行了命令
dropdb foo
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试从 linux 用户 foo 运行 psql 时,出现错误...
psql: FATAL: database "foo" does not exist
Run Code Online (Sandbox Code Playgroud)
那么这是否意味着从 linux 用户帐户运行 psql 时,必须有一个与该 linux 用户帐户相关联的数据库?
我正在尝试在 CASE 表达式上创建索引,如下所示
CREATE TABLE test(i INT, j INT);
CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j END);
Run Code Online (Sandbox Code Playgroud)
收到此错误:
ERROR: syntax error at or near "CASE"
LINE 1: CREATE UNIQUE INDEX test_index ON test(CASE WHEN i=1 THEN j ...
^
********** Error **********
ERROR: syntax error at or near "CASE"
SQL state: 42601
Character: 40
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
Postgres 9.5.2
我有一个相当复杂的 Postgres 数据库,其中许多 UUID 字段被错误地存储为 VARCHAR。我想逐步迁移它们,但不幸的是,这样做打破了我的所有观点,因为 Postgres 没有内置的varchar = uuid. 而是重写我的所有视图或尝试一次大规模迁移,我想临时创建一个 uuid = varchar 运算符,直到迁移完成。
我以前从未创建过自定义运算符,并且我在下面的尝试不起作用:
CREATE OR REPLACE FUNCTION uuid_equal_varchar (varchar, uuid)
RETURNS boolean AS 'SELECT $1::text = $2::text;' LANGUAGE sql IMMUTABLE;
CREATE OPERATOR = (
leftarg = character varying,
rightarg = uuid,
procedure = uuid_equal_varchar,
commutator = =
);
Run Code Online (Sandbox Code Playgroud)
然而,这个运营商打破了一切。包括一个简单的 varchar = varchar 比较(见下文):
SELECT * FROM test WHERE pk_test = '123';
ERROR: invalid input syntax for uuid: "123"
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释我做错了什么吗?我是否试图尝试不可能的事情?
postgresql ×10
datatypes ×2
aggregate ×1
blob ×1
cast ×1
constraint ×1
count ×1
index ×1
index-tuning ×1
insert ×1
many-to-many ×1
operator ×1
psql ×1
uuid ×1