merge into 实现向表中更新内容·

表触发器2.0

行触发器获取的值改为放在中间表中

触发器在向目标表中写数据时,目标表的记录可能不完全,需要向目标表添加不存在的数据。

用到merge into 语法。

merge into  要更新的表(目标表)

using  记录完整的表(源表)

on  两表记录对比条件

when matched then

update

when not matched then

insert

注意:执行过程是源表中记录一条一条去匹配目标表内容,所以源表中数据不能有符合对比条件的重复数据

另:    某语句要查询不重复内容,为了让distinct只作用于某个字段,可以与group by 连用,然后在select中用count函数

select *, count(distinct 字段) from table group by 字段

行触发器:

create or replace trigger qmfawtechnics_row --行触发器,保存更改的masterbsoid
after insert or update or delete
on qmfawtechnics
for each row
declare
p_count number;
begin
if inserting then
select count(*) into p_count
from trigger_qmfawtechnics --中间表已存在
where masterbsoid = :new.masterbsoid;
if p_count = 0 then
insert into trigger_qmfawtechnics
values(:new.masterbsoid, 0); --若已有,则不添加
end if;
end if;

if deleting then
select count(*) into p_count
from trigger_qmfawtechnics
where masterbsoid = :old.masterbsoid;
if p_count = 0 then
insert into trigger_qmfawtechnics
values(:old.masterbsoid, 1);
end if;
end if;

if updating then
select count(*) into p_count
from trigger_qmfawtechnics
where masterbsoid = :old.masterbsoid;
if p_count = 0 then
insert into trigger_qmfawtechnics
values(:old.masterbsoid, 1);
end if;
select count(*) into p_count
from trigger_qmfawtechnics
where masterbsoid = :new.masterbsoid;
if p_count = 0 then
insert into trigger_qmfawtechnics
values(:new.masterbsoid, 0);
end if;
end if;
end;

表触发器:

create or replace trigger qmfawtechnics_table
after insert or update or delete
on qmfawtechnics --表触发器,执行更新操作

begin
--更新工艺最大版序,并放入qmfawtechnicsmaxversionvalue表中
merge into qmfawtechnicsmaxversionvalue t1
using (select distinct masterbsoid
from trigger_qmfawtechnics) t2
on (t1.masterbsoid=t2.masterbsoid)
when matched then
update
set maxversionvalue = getmaxversionvalue(‘qmfawtechnics‘,t2.masterbsoid)
where masterbsoid=t2.masterbsoid
when not matched then
insert
values(t2.masterbsoid,getmaxversionvalue(‘qmfawtechnics‘,t2.masterbsoid));

--更新零件对应的工艺,放入technicscache缓存表
--注意顺序,以下操作要使用更新后的qmfawtechnicsmaxversionvalue表
merge into technicscache t1
using (select distinct a.bsoid, c.carnumber
from technicspart a
join qmpartCarNum c on c.partbsoid=a.partbsoid
join qmfawtechnicsmaster d on d.technicspart=a.bsoid
join trigger_qmfawtechnics e on e.masterbsoid=d.bsoid) t2
on ( t1.carnumber=t2.carnumber and t1.technicspartbsoid = t2.bsoid)
when matched then
update
set technicsbsoid = getJustTechnicsBsoid(t1.technicspartbsoid,t1.carnumber)
where technicspartbsoid = t2.bsoid
when not matched then
insert
values(t2.bsoid,t2.carnumber,getJustTechnicsBsoid(t2.bsoid,t2.carnumber));

delete trigger_qmfawtechnics;
end;

时间: 2024-10-27 00:14:50

merge into 实现向表中更新内容·的相关文章

读取Webpage表中的内容

nutch将从网页中抓取到的信息放入hbase数据库中,默认情况下表名为$crawlId_webpage,但表中的内容以16进制进行表示,直接scan或者通过Java API进行读取均只能读取到16进制信息. 因此nutch提供了readdb选项进行数据获取,将表中的内容读取到一个文本中. 具体用法为: $ bin/nutch readdb Usage: WebTableReader (-stats | -url [url] | -dump <out_dir> [-regex regex])

Sql server的Merge语句,源表中如果有重复数据会导致执行报错

用过sql server的Merge语句的开发人员都应该很清楚Merge用来做表数据的插入/更新是非常方便的,但是其中有一个问题值得关注,那就是Merge语句中的源表中不能出现重复的数据,我们举例来说明这个问题. 现在我们有一张表叫T_Class_A,其建表语句如下: CREATE TABLE [dbo].[T_Class_A]( [ID] [int] IDENTITY(1,1) NOT NULL, [ClassName] [nvarchar](50) NULL, [StudentTotalCo

SQL Server全库搜索(在所有表中查找内容)

SQL Server版本:SQL Server2008某个内容到底存储在数据库的哪个地方?无从下手时,可以使用全库查找.SQL Server在整个库的所有表的所有字段中查找内容,用到了临时表,游标循环. declare @Str nvarchar(max), @tableName varchar(50), @colName varchar(50), @rowCount int select a.name tableName, b.name Colname, 0 as IsFound into #

Mysql查询结果作为另一张表的更新内容

1.将查询结果中有用的数据用分隔符获取,更新到另一张表. DELIMITER $$ DROP FUNCTION IF EXISTS `func_splitString` $$ CREATE FUNCTION `func_splitString` ( f_string VARCHAR(1000),f_delimiter VARCHAR(5),f_order INT) RETURNS VARCHAR(255) CHARSET utf8 BEGIN DECLARE result VARCHAR(255

存储过程查找表中的内容去匹配另一张表中对应的数据,将该表查找到的数据插入到另一张表中

USE [数据库]GO SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE proc [dbo].[表名]as begin declare @Keyword varchar(max),@strs varchar(max) --申明游标 declare MTF_Cursor CURSOR FOR select distinct Keyword from Keywords where Flag=4 --打开游标 open MTF_Cursor fe

MSSQL之三 在表中操纵数据

创建了数据库和表之后,下一步是在数据库中存储数据.作为一个数据库开发人员,你将需要修改或删除数据.你可以通过使用Transact-SQL的数据操纵语言(DML)语句来完成这些数据操纵. 本章讨论如何使用DML语句来操纵表中的数据. 重点 ?      插入数据 ?      更新数据 ?      删除表中数据 预习功课 ?        插入部分数据 ?        批量插入数据 ?        在表中更新数据 ?        从表中删除数据 使用DML语句操纵数据 在表中存储数据 表创

sql 替换字段中部分内容

背景: 项目中安装ssl证书,http升级为https,突然发现文章表中,内容生成的html,域名保存到数据库中, 文章详情字段,出现大量的http://xxx.com/xx  由于内容太多,发愁中ing.... 突然想 update语句能不能更新部分内容,一查发现还真有: update article_form set cont = replace(cont ,'http://','https://'); 一次性解决,速度还挺快 秒级上万条. 原文地址:https://www.cnblogs.

清除mysql表中数据

delete from 表名; truncate table 表名; 不带where参数的delete语句可以删除mysql表中所有内容,使用truncate table也可以清空mysql表中所有内容. 效率上truncate比delete快,但truncate删除后不记录mysql日志,不可以恢复数据. delete的效果有点像将mysql表中所有记录一条一条删除到删完, 而truncate相当于保留mysql表的结构,重新创建了这个表,所有的状态都相当于新表.

Oracle Function:当页面端有屏蔽相关字段数据函数,只有指定用户才能查看;而当前用户无法获取到相关数据插到其他表中,这时需要获取后台用户替换当前用户,执行完相关语句后再还原为当前用户。

1.该函数的作用:入库单提交/审核通过时,将相关数据插到/更新'出入库历史记录表':delivery_entering_record 由于页面端屏蔽了单价,指定的用户才能看到,故 与单价有关的数据插不进"出入库历史记录表"delivery_entering_record中,所以要用后台的用户替换当前用户,执行完相关语句后,在还原为当前用户(如代码:178~184和第208行所示):否则,插进去的数据全为0. 1 create or replace function delivery_e