我在 PostgreSQL 中有一个表,它描述了一些具有开始日期和结束日期的事件:
CREATE TABLE my_table
(
event_id serial NOT NULL,
start_date timestamp without time zone NOT NULL,
end_date timestamp without time zone NOT NULL
)
Run Code Online (Sandbox Code Playgroud)
单个事件可能与前一个和下一个事件重叠。在下表中,4 个事件中的前 3 个形成连续的时间间隔:
1 '2015-04-02 22:09:03' '2015-04-02 22:19:05'
2 '2015-04-02 22:17:38' '2015-04-02 22:27:38'
3 '2015-04-02 22:25:21' '2015-04-02 22:36:23'
4 '2015-04-02 22:45:23' '2015-04-02 22:55:23'
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个查询来检查两个给定日期之间是否存在连续的日期间隔?
我想要一些类似的东西:
select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Run Code Online (Sandbox Code Playgroud) 有没有办法强制所有文本数据为大写,而不必重复为每个表编写函数或在客户端执行?
我有这些整理:
postgres=# select * from pg_collation; 姓名 | collnamespace | 领主| collencoding | 整理 | 类型 ------------+--------------+-----------+--------- -----+-------------+------------ 默认 | 11 | 10 | -1 | | C | 11 | 10 | -1 | C | C POSIX | 11 | 10 | -1 | POSIX | POSIX zh_CN | 11 | 10 | 6 | en_US.utf8 | en_US.utf8 en_US.utf8 | 11 | 10 | 6 | en_US.utf8 | en_US.utf8 ucs_basic | 11 | 10 | 6 | C …
我正在想办法构建一个新的 PostgreSQL 数据库,我很好奇是否可以使用 JSONB 列而不是 EAV 模型来存储实体的属性。这似乎是一种灵活的方式来存储这些东西。
在 EAV 情况下,我将有 3 个表:
materials (mat_id, mat_name, mat_descr)
material_properties (prop_id, prop_name, prop_desc)
material_property_values (mat_id, prop_id, val)
Run Code Online (Sandbox Code Playgroud)
每种材料都可以有一组不同的属性。
有什么原因我不应该只mat_props JSONB在我的materials表中添加一列,并将所有属性存储在那里{"name":"value"}?这样,将属性作为列进行查询将非常简单:
SELECT mat_name, mat_props->'name' as propval FROM materials
Run Code Online (Sandbox Code Playgroud)
而不是连接或子选择。
另外,我是否可以在materials表中添加此列,或者将其保存在单独的表中是否会更高效:
material_properties (mat_id, properties JSONB)
Run Code Online (Sandbox Code Playgroud) 我在 PostgreSQL 9.4 中有一个表,我对其进行了分区,以便对父分区的所有插入实际上都进入其中一个子分区。问题是在创建分区之前,我的父表中已经有数亿行数据。
父级和子级存在于不同的模式中:
家长:public.history_uint
孩子:partitions.history_uint_p2015_mm_dd
TRUNCATE父母如何而不是孩子?
有没有办法在 Postgres 9.3.9 中记录单个连接或用户或客户端主机的所有 SQL 查询?
换句话说,我log_statement = all只想要某个用户名或客户端主机名或客户端 IP 或连接 ID。
一种选择是记录所有客户端的 SQL 活动并搜索日志。我希望有更好的方法。
BEGIN;
INSERT INTO foo_table(foo_column) VALUES('a'),('b'),('c');
-- SELECT * FROM pg_stat_activity WHERE ...
-- shows records with a flag if they have been added/deleted/updated
END;
Run Code Online (Sandbox Code Playgroud)
有没有办法查看 PostgreSQL 9.x 中给定表的事务未提交的插入/删除?这纯粹是为了视觉确认。
虽然我最初的想法是否定的(只对表执行 SQL-Select),但某些用户想要可视化事务中的差异。如果有很多保存点和事务,我可以看到这会有什么帮助。因此,值得向整个社区询问。
我创建了一个自定义类型:
CREATE TYPE my_type as(name text, street text, location text);
Run Code Online (Sandbox Code Playgroud)
初始化这样的类型很容易:
SELECT ROW('a', 'b', 'c')::my_type;
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一种简单的方法可以部分初始化类型,这意味着所有未提及的列都隐式设置为 null。在伪代码中,类似于:
SELECT ROW('a', 'c')::my_type(name, location);
Run Code Online (Sandbox Code Playgroud)
另外,当列未按正确顺序提及时,是否还有一种初始化类型的方法?在伪代码中,类似于:
SELECT ROW('c', 'a', 'b')::my_type(location, name, street);
Run Code Online (Sandbox Code Playgroud) 我有一个查询,用于生成一些文本以创建一些 VALUES 文本以放入 .sql 文件以插入一些行。我在结果中得到一个空行:
postgres=# SELECT ' (' || obj_id || ', ''' || obj_type || '''),' FROM il2.objects WHERE obj_id < 11 ORDER BY obj_id;
?column?
-------------------------
(1, 'ScienceDomain'),
(3, 'PIs'),
(10, 'Instrument'),
(4 rows)
Run Code Online (Sandbox Code Playgroud)
执行 a select *,很明显它是由obj_typeNULL 为obj_id2引起的:
postgres=# SELECT * FROM il2.objects WHERE obj_id < 11;
obj_id | obj_type
--------+---------------
10 | Instrument
1 | ScienceDomain
2 |
3 | PIs
(4 rows)
Run Code Online (Sandbox Code Playgroud)
(确认它是NULL):
postgres=# SELECT * FROM il2.objects WHERE …Run Code Online (Sandbox Code Playgroud) 当表具有 json 或 jsonb 列时,是否无法在 INSERT/UPDATE 触发器中进行全行比较?我收到的错误让我认为我需要单独比较每一列,因为该NEW.*/OLD.*格式不能用于比较 json 列。
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at = now();
RETURN NEW;
ELSE
RETURN OLD;
END IF;
END;
$$ language 'plpgsql';
CREATE TRIGGER mytable_insert_update
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE on_insert_update_modified();
Run Code Online (Sandbox Code Playgroud)
当我插入包含 json 和 jsonb 列的表时,出现以下错误:
CREATE OR REPLACE FUNCTION on_insert_update_modified()
RETURNS TRIGGER AS $$
BEGIN
IF row(NEW.*) IS DISTINCT FROM row(OLD.*) THEN
NEW.modified_at …Run Code Online (Sandbox Code Playgroud) postgresql ×10
json ×2
cast ×1
collation ×1
concat ×1
datatypes ×1
eav ×1
localization ×1
log ×1
null ×1
partitioning ×1
plpgsql ×1
select ×1
syntax ×1
transaction ×1
trigger ×1
truncate ×1