MySQL 语句级避免重复插入—— Insert Select Not Exist

Posted on

MySQL 语句级避免重复插入—— Insert Select Not Exist

想要插入一条数据,要避免重复插入,又不想折腾两回数据库连接操作,可以参考如下办法。 Sql代码 复制代码 收藏代码

  1. INSERT INTO table(column1,column2,column3 ...columnN)
  2. SELECT value1,value2,value3 ...valueN
  3. FROM dual
  4. WHERE NOT EXISTS(
  5. SELECT /*
  6. FROM table
  7. WHERE value = ?
  8. );

INSERT INTO table(column1,column2,column3 ...columnN)

SELECT value1,value2,value3 ...valueN FROM dual

WHERE NOT EXISTS( SELECT /*

  FROM table
  WHERE value = ?

); dual是为了构建查询语句而存在的表,Oracle中很常见,配合INSERT ... SELECT构建成我们需要的表,并指定了数据项. EXISTS通过这个判断是否存在的函数,就免去了我们做IF-ELSE的冗繁操作. 例: Sql代码 复制代码 收藏代码

  1. INSERT INTO content (
  2. detail,
  3. status,
  4. beginTime,
  5. endTime)
  6. SELECT
  7. @detail,
  8. 1,
  9. NULL,
  10. NULL
  11. FROM DUAL
  12. WHERE NOT EXISTS(
  13. SELECT contentId
  14. FROM content
  15. WHERE detail=@detail);

    INSERT INTO content (

     detail,
     status,
    
     beginTime,
     endTime)
    

    SELECT

     @detail,
    
     1,
     NULL,
    
     NULL
    

    FROM DUAL

    WHERE NOT EXISTS(

      SELECT contentId
    
      FROM content
      WHERE detail=@detail);
    

    @detail是要存入的内容,这里对内容进行了检索,如果要这么做,最好对该字段做唯一约束,或加索引。 省掉了IF-ELSE,在iBatis配置一下就ok了,哈! 还有个更坚决的办法——replace into: Sql代码 复制代码 收藏代码

  16. replace into blacklist(userInfoId,uid)

  17. select userInfoId,uid from user_info u where uid in(
  18. 'u303565440','u303566922','u303515112','u303559738');

replace into blacklist(userInfoId,uid)

select userInfoId,uid from user_info u where uid in( 'u303565440','u303566922','u303515112','u303559738');

希望本站内容对您有点用处,有什么疑问或建议请在后面留言评论
转载请注明作者(RobinChia)和出处 It so life ,请勿用于任何商业用途