SQL假如id存在就update ,如果不存在就insert ,这样的语句怎么写啊?if exists(SELECT ) 吗?怎么得到

时间:2020-12-27 22:22:00
SQL假如id存在就update ,如果不存在就insert ,这样的语句怎么写啊?if exists(SELECT ) 吗?怎么得到?

表jilu设计
id,
sid,
tn,值ding,unti,not
date,格式2009-08-15 DATE
total,同sid,同tn,同date的数目


里面的数据
id,sid,tn,date,total
10,1,ding,2009-08-12,20
20,22,unti,2008-02-10



假如在表中存在sid=10 并且date=2009-05-10 并且tn的值等于ding的,那么就将该id的total的值自动加一,如果没有符合这样的条件的,那么就insert新的记录,记录的sid=10,date=今日的值,tn等于ding,total等于1


这样的SQL语句如何写啊?
我这几天都是弄这个jilu表的统计的,希望大家帮我。


8 个解决方案

#1


replace into..语句可以实现。
只是要求你的表里要有主键。

#2


能够写详细点吗?
表jilu中的主键是id

#3


你可以参考一下 insert into .... ON DUPLICATE KEY UPDATE ...

MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html

#4


官方手册中的例子

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1


另外建议不要用 date 这种保留字 做为字段名。

#5


楼上的方法不错,没用过,存储过程可以实现。

DELIMITER //
DROP PROCEDURE IF EXISTS sp_insert_update
//

CREATE PROCEDURE sp_insert_update(in vsid int,in vtn varchar(20),in vdate date)
BEGIN
   DECLARE num int DEFAULT 0;
   DECLARE vid int DEFAULT 0;
   
   SELECT count(*),jl.id INTO num,vid FROM jilu jl WHERE EXISTS (
      SELECT 1 FROM jilu j WHERE j.sid=vsid AND j.tn=vtn AND j.date=vdate)
      GROUP BY jl.id LIMIT 1;
   
   IF num=0 THEN 
      INSERT INTO jilu VALUES (null,vsid,vtn,vdate,1);
   ELSE
      UPDATE jilu SET total=total+1 WHERE id=vid;
   END IF;
END;
//

#6


或者用触发器,用楼上的方法进行判断

#7


两条SQL就行了:
UPDATE jilu SET total = total + 1
WHERE sid = 10 AND `date` = '2009-05-10' AND tn = 'ding';

INSERT INTO jilu (sid, `date`, tn, total)
SELECT 10, CURDATE(), 'ding', 1
FROM jilu
WHERE ROW_COUNT() = 0;

#8


好样的,学习了

#1


replace into..语句可以实现。
只是要求你的表里要有主键。

#2


能够写详细点吗?
表jilu中的主键是id

#3


你可以参考一下 insert into .... ON DUPLICATE KEY UPDATE ...

MySQL官方文档  http://dev.mysql.com/doc/refman/5.1/zh/index.html

#4


官方手册中的例子

INSERT INTO table (a,b,c) VALUES (1,2,3)
  ON DUPLICATE KEY UPDATE c=c+1;

设置你的这个表 jilu 中 sid,date 为复合的unique 索引。
然后
insert into jilu values (xx,xxx,xxx,xx) on duplicate key update total=total+1


另外建议不要用 date 这种保留字 做为字段名。

#5


楼上的方法不错,没用过,存储过程可以实现。

DELIMITER //
DROP PROCEDURE IF EXISTS sp_insert_update
//

CREATE PROCEDURE sp_insert_update(in vsid int,in vtn varchar(20),in vdate date)
BEGIN
   DECLARE num int DEFAULT 0;
   DECLARE vid int DEFAULT 0;
   
   SELECT count(*),jl.id INTO num,vid FROM jilu jl WHERE EXISTS (
      SELECT 1 FROM jilu j WHERE j.sid=vsid AND j.tn=vtn AND j.date=vdate)
      GROUP BY jl.id LIMIT 1;
   
   IF num=0 THEN 
      INSERT INTO jilu VALUES (null,vsid,vtn,vdate,1);
   ELSE
      UPDATE jilu SET total=total+1 WHERE id=vid;
   END IF;
END;
//

#6


或者用触发器,用楼上的方法进行判断

#7


两条SQL就行了:
UPDATE jilu SET total = total + 1
WHERE sid = 10 AND `date` = '2009-05-10' AND tn = 'ding';

INSERT INTO jilu (sid, `date`, tn, total)
SELECT 10, CURDATE(), 'ding', 1
FROM jilu
WHERE ROW_COUNT() = 0;

#8


好样的,学习了