当前位置: 代码迷 >> Sql Server >> 怎么实现不存在则插入,存在则更新
  详细解决方案

怎么实现不存在则插入,存在则更新

热度:81   发布时间:2016-04-24 10:19:12.0
如何实现不存在则插入,存在则更新?
就是有一张表,其中一列是主键,剩下还有很多其他列
现在想实现,如果插入时发生主键冲突就变成更新(更新除了主键列以外的其他所有列),如果没发生主键冲突就正常插入

求解各位大神,这个如何实现呢?
百度了很多,没有找到一个合适的,所以就来求教了
------解决方案--------------------
很简单的一招,SQL如下:
update xxx set a=1,b=2,...
if @@ROWCOUNT=0 insert xxx 
------解决方案--------------------
sql server 2008 可以用merge语句试试用
------解决方案--------------------
也可以在表上建个instead of 触发器
------解决方案--------------------

也可以考虑下存储过程,以主键作为参数
create proc proc_chk_infor(@pk)_id int)
as
       declare @count int
       select @count=count(*) from table_name where pk_id=@pk_id
       if @count>0
       update table_name set column_name_1=new_value,...column_name_n=new_value where pk_id=@pk_id
      else
       insert into table_name values(column_values)    --如果列不多,列值可以考虑作参数

------解决方案--------------------
可以使用merge into 相当于 
if exists(...)
  update table
else
  insert into table

它的基本语法:
MERGE 目标表
USING 源表
ON 匹配条件
WHEN MATCHED THEN
 跟新语句
WHEN NOT MATCHED THEN
 删除语句
------解决方案--------------------
if exists(select 1 from tb where 主键=插入的数据主键列)
begin
    delete from tb where 主键=插入的数据主键列
end
insert into tb (col1,col2..)
   values (val1,val2..)
 简单来说,就是先判断插入的数据是否存在主键相同的数据,有就删除。然后再进行插入,不用去更新了
引用:
感谢上面的各位

Quote: 引用:


也可以考虑下存储过程,以主键作为参数
create proc proc_chk_infor(@pk)_id int)
as
       declare @count int
       select @count=count(*) from table_name where pk_id=@pk_id
       if @count>0
       update table_name set column_name_1=new_value,...column_name_n=new_value where pk_id=@pk_id
      else
       insert into table_name values(column_values)    --如果列不多,列值可以考虑作参数


再问一个小问题,我的表字段非常多,像insert和update的时候只能一列一列的都写出来吗?有没有简便的写法什么的

------解决方案--------------------
如果源表和目标表的数据结构一致,并且没有计算列的话,可以直接insert into Tb1 select * from tb2 where xxx=xxx
update 语句的话,只能老老实实地把每个列写出来
引用:
if exists(select 1 from tb where 主键=插入的数据主键列)
begin
    delete from tb where 主键=插入的数据主键列
end
insert into tb (col1,col2..)
   values (val1,val2..)
 简单来说,就是先判断插入的数据是否存在主键相同的数据,有就删除。然后再进行插入,不用去更新了
Quote: 引用:

感谢上面的各位

Quote: 引用:


也可以考虑下存储过程,以主键作为参数
create proc proc_chk_infor(@pk)_id int)
as
       declare @count int
       select @count=count(*) from table_name where pk_id=@pk_id
       if @count>0
       update table_name set column_name_1=new_value,...column_name_n=new_value where pk_id=@pk_id
      else
       insert into table_name values(column_values)    --如果列不多,列值可以考虑作参数


再问一个小问题,我的表字段非常多,像insert和update的时候只能一列一列的都写出来吗?有没有简便的写法什么的

------解决方案--------------------
再问一个小问题,我的表字段非常多,像insert和update的时候只能一列一列的都写出来吗?有没有简便的写法什么的

用動態SQL語句可以實現.
  相关解决方案