V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
MySQL 5.5 Community Server
MySQL 5.6 Community Server
Percona Configuration Wizard
XtraBackup 搭建主从复制
Great Sites on MySQL
Percona
MySQL Performance Blog
Severalnines
推荐管理工具
Sequel Pro
phpMyAdmin
推荐书目
MySQL Cookbook
MySQL 相关项目
MariaDB
Drizzle
参考文档
http://mysql-python.sourceforge.net/MySQLdb.html
pppguest3962
V2EX  ›  MySQL

请教一条 MYSQL 语句,根据 SELECT 有无数据,进行 INSERT,或者是什么都不做...

  •  1
     
  •   pppguest3962 · 2021-03-27 21:34:49 +08:00 · 3854 次点击
    这是一个创建于 1370 天前的主题,其中的信息可能已经有所发展或是发生改变。

    老旧系统,历史原因,因为提交接口是一个 SQL 命令队列,所以这个实现,只能用 MYSQL 一条语句提交去完成判断,并且根据判断有无结果来进行是否 INSERT

    分开写是这样的:

    SELECT 判断有无数据

    SELECT caseid FROM caseresult WHERE caseid='1897';

    如果上面的查询语句查询到 [没有] 数据,则:

    INSERT INTO casecheck (flag,section,checktime) VALUES ('2','8',now());

    如果上面 SELECT 有数据,则什么都不做...

    以上:
    能不能一句 MYSQL 搞定?
    谢谢解答!

    30 条回复    2021-03-28 16:15:57 +08:00
    xiangyuecn
        1
    xiangyuecn  
       2021-03-27 21:42:02 +08:00   ❤️ 2
    insert tab(a,b,c) select 1,2,3

    insert 并非一定要接一个 values,接一个 select 也是可以的,简单快速
    qazwsxkevin
        3
    qazwsxkevin  
       2021-03-27 21:52:27 +08:00
    楼上两位理解不是这样的,也可能我没说清楚,并非是为了防重复
    语句是通过 String 操作组装起来的,
    语句的根本逻辑是,判断 A 事情是否有,但做的 B 事情,跟 A 事情完全没有关系,并且是两个不同的逻辑。
    qazwsxkevin
        4
    qazwsxkevin  
       2021-03-27 21:53:45 +08:00
    qazwsxkevin
        5
    qazwsxkevin  
       2021-03-27 21:57:01 +08:00
    B 的事情,完全不借助 A 的内容,只是判断 A 在这张表里有没有匹配 WHERE 的数据,有就 INSERT 另外一套组装好的数据,没有就什么都不做
    qazwsxkevin
        6
    qazwsxkevin  
       2021-03-27 21:58:12 +08:00
    刚才同事忘了 Logout 自己账号,所以用了他的账号发了贴,抱歉
    yjxjn
        7
    yjxjn  
       2021-03-27 22:01:55 +08:00 via iPhone
    isnull 写一条就完事了
    yjxjn
        8
    yjxjn  
       2021-03-27 22:03:21 +08:00 via iPhone   ❤️ 1
    说错了,在 oracle 里面 nvl 或者 nvl2 解决了
    Ptu2sha
        9
    Ptu2sha  
       2021-03-27 22:03:29 +08:00
    所以 你是没看过 if 语句?
    monsterxx03
        10
    monsterxx03  
       2021-03-27 22:10:23 +08:00 via Android   ❤️ 1
    caseid 如果是 unique key,可以用 insert ignore
    uselessVisitor
        11
    uselessVisitor  
       2021-03-27 22:20:18 +08:00
    case when 不能做吗。。
    uselessVisitor
        12
    uselessVisitor  
       2021-03-27 22:36:11 +08:00
    @beichenhpy 不能做。。
    uselessVisitor
        13
    uselessVisitor  
       2021-03-27 22:45:14 +08:00   ❤️ 1
    想到一个办法:
    insert into casecheck (flag,section,checktime) select '2','8',now() where not exists(SELECT caseid FROM caseresult WHERE caseid='1897')
    pppguest3962
        14
    pppguest3962  
    OP
       2021-03-27 22:53:11 +08:00
    @yjxjn 对 MYSQL 不熟悉才问的,IFNULL 的参数,如果一值为 Empty,二值是不能一句 INSERT INTO 的。。。
    @beichenhpy case when 只能本表
    uselessVisitor
        15
    uselessVisitor  
       2021-03-27 22:54:41 +08:00
    @pppguest3962 你看一下我最新的一条回复,应该可以,我自己试了一下
    xmpx310
        16
    xmpx310  
       2021-03-27 23:27:09 +08:00
    replace into ?
    mingl0280
        17
    mingl0280  
       2021-03-27 23:42:05 +08:00 via Android
    往数据库里插存储过程呗,调用就一句了。
    l00t
        18
    l00t  
       2021-03-28 00:02:12 +08:00
    一楼就告诉你答案了……
    pppguest3962
        19
    pppguest3962  
    OP
       2021-03-28 01:02:04 +08:00
    @beichenhpy 谢谢,我试着测试一下,我这里测试没通过。。。。

    INSERT INTO casecheck `flag` SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');




    1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`flag` SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `case' at line 1
    时间: 0.001s
    dvvj
        20
    dvvj  
       2021-03-28 01:15:11 +08:00   ❤️ 1
    语法错了? INSERT INTO casecheck (flag) SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
    radishear
        21
    radishear  
       2021-03-28 01:16:57 +08:00
    你这个需求用 NOT EXISTS 很适合啊
    apostle
        22
    apostle  
       2021-03-28 01:32:45 +08:00 via Android   ❤️ 1
    insert ignore into
    radishear
        23
    radishear  
       2021-03-28 01:32:46 +08:00   ❤️ 1
    INSERT INTO casecheck (flag) values('2') WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
    pppguest3962
        24
    pppguest3962  
    OP
       2021-03-28 01:40:52 +08:00
    @dvvj
    @radishear

    反复确认了 N 次,应该语法是没错的,还是不通过
    总是提示" MySQL server version for the right syntax to use near 'WHERE NOT EXISTS "
    错在 WHERE
    VALUE,VALUES 都试过了,``''这些符号都增加和删除过,有些怀疑是不是这样行不通,
    累了,准备歇一会儿,明天再继续,问题可能很弱智,也有可能是我肤浅,麻烦大家,真不好意思...
    eason1874
        25
    eason1874  
       2021-03-28 08:47:48 +08:00   ❤️ 1
    一楼说的那个可以,SQL INSERT INTO SELECT Statement,意思是插入 SELECT 出来的结果,如果 SELECT WHERE 失败那么插入就不会被执行。

    虽然你插入的内容跟 SELECT 结果无关,但是一样可以运用这个逻辑,只不过插入值不写列名,直接写值而已。

    如果不存在 SELECT caseid FROM caseresult WHERE caseid='1897';
    就执行 INSERT INTO casecheck (flag,section,checktime) VALUES ('2','8',now());

    结合起来就是
    INSERT IGNORE INTO casecheck (flag, section, checktime)
    SELECT '2', '8', now()
    FROM caseresult WHERE NOT EXISTS (SELECT caseid FROM caseresult WHERE caseid='1897' LIMIT 1) LIMIT 1;
    songpengf117
        26
    songpengf117  
       2021-03-28 08:51:01 +08:00 via iPhone   ❤️ 1
    SQL 格式是 insert into 表名 列名 select 数据 from 临时表名 where not exists... 这里要借用临时表 dual 参考 https://blog.csdn.net/u013467442/article/details/89164215?ivk_sa=1024320u
    eason1874
        27
    eason1874  
       2021-03-28 08:59:34 +08:00   ❤️ 1
    @songpengf117 #26 对,满足语句要求用临时表名好点,更清晰。

    INSERT INTO 表名 列名
    SELECT 插入值
    FROM dual WHERE NOT EXISTS (条件查询)

    涉及唯一列再加个 IGNORE
    uselessVisitor
        28
    uselessVisitor  
       2021-03-28 10:23:37 +08:00   ❤️ 1
    @pppguest3962 我这边测试了,没问题的。。看一下你数据表吧
    suanbaner
        29
    suanbaner  
       2021-03-28 11:50:05 +08:00   ❤️ 1
    二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了
    c6h6benzene
        30
    c6h6benzene  
       2021-03-28 16:15:57 +08:00 via iPhone   ❤️ 1
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5399 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 08:46 · PVG 16:46 · LAX 00:46 · JFK 03:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.