我在 PostgreSql 9.1 中有一个触发器,我想在插入多个表时触发它。是否可以让它影响所有这些表而不是为所有这些表创建触发器?我有 58 个表,我想使用调用触发器函数的同一个插入触发器,所以我一直在使用
create trigger tuweke
after insert on product
for each row execute procedure tuwekeAdjustextract();
create trigger tuweke
after insert on caneweightment
for each row execute procedure tuwekeAdjustextract();
...
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) 我总是了解到并理解,只有当我们对前导(或所有)列有谓词时才能使用索引。现在,令我惊讶的是,我注意到以下查询中使用了GiST 索引。这是为什么?这是 GiST 索引的特殊功能吗?
CREATE TABLE t1 (
i INT,
j INT,
k INT
);
INSERT INTO t1
SELECT i, j, k
FROM GENERATE_SERIES(1, 100) AS i,
GENERATE_SERIES(1, 100) AS j,
GENERATE_SERIES(1, 100) AS k;
CREATE INDEX ON t1 USING GiST(i, j, k);
EXPLAIN SELECT * FROM t1 WHERE k = 54;
Run Code Online (Sandbox Code Playgroud)
QUERY PLAN
Bitmap Heap Scan on t1 (cost=199.03..5780.51 rows=5000 width=12)
Recheck Cond: (k = 54)
-> Bitmap Index Scan on t1_i_j_k_idx (cost=0.00..197.78 rows=5000 width=0)
Index Cond: …Run Code Online (Sandbox Code Playgroud) 在我的 Google Cloud SQL 数据库实例 (Postgres 9.6) 上,我无法通过 GCP Console 删除通过 GCP Console 创建的用户/角色。当我尝试时,控制台显示一条通知,显示“用户已删除”,然后经过进一步检查,我发现操作失败并出现“未知错误”。实例的错误日志显示以下错误:
06:42:36.347 UTC [199]: [1-1] db=cloudsqladmin,user=cloudsqlagent ERROR: role "user1" cannot be dropped because some objects depend on it
06:42:36.347 UTC [199]: [2-1] db=cloudsqladmin,user=cloudsqlagent DETAIL: privileges for database mydb
24 objects in database mydb
Run Code Online (Sandbox Code Playgroud)
我可以通过运行看到 24 个对象
06:42:36.347 UTC [199]: [1-1] db=cloudsqladmin,user=cloudsqlagent ERROR: role "user1" cannot be dropped because some objects depend on it
06:42:36.347 UTC [199]: [2-1] db=cloudsqladmin,user=cloudsqlagent DETAIL: privileges for database mydb
24 objects …Run Code Online (Sandbox Code Playgroud) 目前尚不清楚当列设置为 时 Postgres 采取的策略NULL:
UPDATE tbl SET
col1 = NULL,
col2 = NULL
WHERE created < current_date - INTERVAL '1 year';
Run Code Online (Sandbox Code Playgroud)
文档https://www.postgresql.org/docs/current/mvcc.html有点冗长和技术性,所以我无法可靠地推断:
是否就地执行设置为 NULL 或复制受影响的行/页?
看起来任何 UPDATE 都应该为 MVCC 语义创建新行,但如果设置为 NULL 是一种特殊情况怎么办?
为了遵守 GDPR,我认为要清空所有个人历史数据,并尝试理解大规模定期数据的含义UPDATE SET x = NULL。我应该考虑VACUUM之后吗?
我试图了解可重复读取隔离级别是否足以满足我在使用 Postgres 的应用程序中的场景,但文档使得很难理解哪个最适合。
我有一个应用程序启动一个事务,该事务首先根据单行的主键读取该行的当前值,在从消息队列接收到事件后计算该行的新状态应该是什么,然后更新数据库中该行的状态。
假定部署了应用程序的多个实例,并且可以同时接收到同一个主键的消息队列上的多个事件,则有可能有 2 个事务可能会尝试同时进入上述事务。对于这种情况,隔离是否repeatable read足够好,或者我是否需要考虑使用serializable?我的假设是,如果第一个事务尝试将其结果提交到数据库,而第二个事务正在进行中,则第二个事务将因冲突而失败,因为它发现它尝试更新的行已被第一个事务修改 -它是否正确?
还有一个后续问题:我想了解使用可序列化事务隔离与可重复读取相比“昂贵”多少 - 我想了解 postgres 内发生的情况的底层机制 - 即是否存在锁定,这对同时运行的其他查询的性能有何影响?
我在“资产”表中有一个名为“参数”的 json 列。json 是嵌套的并具有以下结构:
{
"params1": {"k": 1.1, "efficiency": 0.7},
"params2": {"k": 1.9, "C_max": 100.0, "C_min": 10.0}
}
Run Code Online (Sandbox Code Playgroud)
我只想更新“params2”中的一个值“k”,并保持其余值不变。我尝试使用以下代码:
update "Assets"
set "Parameters" = "Parameters"::jsonb || '{"params2":{"k":2.2}}'::jsonb
where "Id" = 185;
Run Code Online (Sandbox Code Playgroud)
这导致
{
"params1": {"k": 1.1, "efficiency": 0.7},
"params2": {"k": 2.2}
}
Run Code Online (Sandbox Code Playgroud)
因此“params2”中的其余参数被删除,这是不希望的。修改“k”并保持其余部分不变的方法是什么?
我有下表,名为商店:
store_id INT
emails VARCHAR
Run Code Online (Sandbox Code Playgroud)
其中包含值:
| 商店ID | 电子邮件 |
|---|---|
| 1 | user_1@example.com,user2@example.com |
| 2 | uswe3@example.com,user4@example.com |
| 4 | admin@example.com |
我想生成以下集合:
| 商店ID | 电子邮件 |
|---|---|
| 1 | user_1@example.com |
| 1 | user2@example.com |
| 2 | uswe3@example.com |
| 2 | user4@example.com |
| 4 | admin@example.com |
正如您所看到的,我想将电子邮件字段拆分为仅包含一个电子邮件地址的单独记录。你知道我该怎么做吗?
到目前为止,我成功创建了以下查询:
select store_id,string_to_array(emails,',') from stores
Run Code Online (Sandbox Code Playgroud)
但我不知道如何将其拆分string_to_array为自己的行。
我知道分析物化视图 (MV) 是有意义的,但由于 MV 不可更新,这是否意味着我们不需要清理 MV?
我有一个 PostgreSQL 表phase_steps,包含以下示例行:
phase_step_id|step_type|step_status|
-------------+---------+-----------+
1| RESEARCH| |
2| SURVEY| |
Run Code Online (Sandbox Code Playgroud)
更新step_status列的值取决于该值
step_type是什么。
当step_type为“RESEARCH”时,只能输入“COMPLETE”或“INCOMPLETE”值step_status。
当step_type为“SURVEY”时,只能输入“ASSIGNED”或“NOT ASSIGNED”值step_status。
step_status我尝试通过以下过程管理“研究”约束:
create or replace function insert_step_status_value() returns trigger as $$
begin
if (new.step_status != 'COMPLETE') or (new.step_status != 'INCOMPLETE')
from phase_steps where step_type = 'RESEARCH'
then
raise exception 'Status value not in range for this phase step';
end if;
return new;
end;
$$ language plpgsql;
create trigger check_step_status_value before update …Run Code Online (Sandbox Code Playgroud) postgresql trigger database-design constraint check-constraints
postgresql ×10
trigger ×3
json ×2
vacuum ×2
constraint ×1
gist-index ×1
index-tuning ×1
plpgsql ×1
transaction ×1