postgres模拟merge

群里这几天一直有人要做类似merge或者replace的操作,嚷嚷表字段多 用function进行insert or update写起来麻烦。OK,下面贴一个 触发器进行replace的demo 

写个触发器 插入之前执行触发器 

-- 创建一个测试表 

create table test(id int primary key , name varchar(50)); 

-- 触发器 插入前ID如果已经存在则替换name的值 
CREATE OR REPLACE function _replace() RETURNS TRIGGER AS $INSERT$ 

declare 

_has int ; 

BEGIN 


-- 判断ID 是否已经存在 
select 1 from test where id = NEW.id into _has; 

raise notice 'ddd:%' , _has; 

if _has > 0 then 
-- 存在 则更新 然后返回null 
update test set name = NEW.name where id = NEW.id; 

RETURN null; 


end if; 
-- 不存在 则返回 让执行该做的插入操作 
return NEW; 


END; 

$INSERT$ 

LANGUAGE PLPGSQL; 

-- 给表加上触发器 只针对insert 
CREATE TRIGGER tbefore BEFORE INSERT ON test FOR EACH ROW EXECUTE PROCEDURE _replace(); 

-- 插入两个值 
insert into test(id , name) values(1,'1'); 
insert into test(id , name) values(1,'6'); 

--查询 

select * from test; 

结果: 

pumpkin=> select * from test; 
id | name 
----+------ 
1 | 6 
(1 行记录) 

### PostgreSQL 12.7 中 `MERGE INTO` 的使用方法 在 PostgreSQL 12.7 版本中,`MERGE INTO` 是一种用于执行合并操作的 SQL 命令。此命令允许在一个单一的操作中完成插入、更新或删除目标表中的数据[^1]。 #### 使用语法: 基本语法如下所示: ```sql MERGE INTO target_table USING source_table ON condition WHEN MATCHED THEN UPDATE SET column1 = value1, column2 = value2, ... WHEN NOT MATCHED THEN INSERT (column1, column2, ...) VALUES (value1, value2, ...); ``` - **target_table**: 被修改的目标表格名称。 - **source_table**: 提供新数据的数据源表格名称。 - **condition**: 定义如何匹配两个表之间的记录条件表达式。 - **UPDATE SET clause**: 当找到匹配项时要应用的更改说明。 - **INSERT clause**: 如果未发现任何匹配,则应创建的新行定义。 #### 实现细节: 为了支持高效的合并处理,在内部实现上会利用索引来加速连接过程并减少锁定时间。此外,还引入了一些优化措施来提高性能表现,比如批量读取和写入机制以及最小化日志开销等特性。 #### 示例代码: 下面是一个具体的例子,展示怎样把来自临时表 (`temp_sales`) 的销售信息同步到正式的历史销售记录表(`sales_history`)里去: ```sql MERGE INTO sales_history AS sh USING temp_sales AS ts ON sh.sale_id = ts.id AND sh.product_code = ts.prod_cd WHEN MATCHED THEN UPDATE SET quantity_sold = ts.qty, sale_date = ts.date_of_sale WHEN NOT MATCHED THEN INSERT (sale_id, product_code, quantity_sold, sale_date) VALUES (ts.id, ts.prod_cd, ts.qty, ts.date_of_sale); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值