› 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 · Mar 27, 2021 · 5031 views
    This topic created in 2009 days ago, the information mentioned may be changed or developed.

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

    分开写是这样的:

    SELECT 判断有无数据

    SELECT caseid FROM caseresult WHERE caseid='1897';

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

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

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

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

    30 replies  •  2021-03-28 16:15:57 +08:00
    xiangyuecn
        1
    xiangyuecn  
       Mar 27, 2021   ❤️ 2
    insert tab(a,b,c) select 1,2,3

    insert 并非一定要接一个 values,接一个 select 也是可以的,简单快速
    qazwsxkevin
        3
    qazwsxkevin  
       Mar 27, 2021
    楼上两位理解不是这样的,也可能我没说清楚,并非是为了防重复
    语句是通过 String 操作组装起来的,
    语句的根本逻辑是,判断 A 事情是否有,但做的 B 事情,跟 A 事情完全没有关系,并且是两个不同的逻辑。
    qazwsxkevin
        4
    qazwsxkevin  
       Mar 27, 2021
    qazwsxkevin
        5
    qazwsxkevin  
       Mar 27, 2021
    B 的事情,完全不借助 A 的内容,只是判断 A 在这张表里有没有匹配 WHERE 的数据,有就 INSERT 另外一套组装好的数据,没有就什么都不做
    qazwsxkevin
        6
    qazwsxkevin  
       Mar 27, 2021
    刚才同事忘了 Logout 自己账号,所以用了他的账号发了贴,抱歉
    yjxjn
        7
    yjxjn  
       Mar 27, 2021 via iPhone
    isnull 写一条就完事了
    yjxjn
        8
    yjxjn  
       Mar 27, 2021 via iPhone   ❤️ 1
    说错了,在 oracle 里面 nvl 或者 nvl2 解决了
    Ptu2sha
        9
    Ptu2sha  
       Mar 27, 2021
    所以 你是没看过 if 语句?
    monsterxx03
        10
    monsterxx03  
       Mar 27, 2021 via Android   ❤️ 1
    caseid 如果是 unique key,可以用 insert ignore
    zm8m93Q1e5otOC69
        11
    zm8m93Q1e5otOC69  
       Mar 27, 2021
    case when 不能做吗。。
    zm8m93Q1e5otOC69
        12
    zm8m93Q1e5otOC69  
       Mar 27, 2021
    @beichenhpy 不能做。。
    zm8m93Q1e5otOC69
        13
    zm8m93Q1e5otOC69  
       Mar 27, 2021   ❤️ 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
       Mar 27, 2021
    @yjxjn 对 MYSQL 不熟悉才问的,IFNULL 的参数,如果一值为 Empty,二值是不能一句 INSERT INTO 的。。。
    @beichenhpy case when 只能本表
    zm8m93Q1e5otOC69
        15
    zm8m93Q1e5otOC69  
       Mar 27, 2021
    @pppguest3962 你看一下我最新的一条回复,应该可以,我自己试了一下
    xmpx310
        16
    xmpx310  
       Mar 27, 2021
    replace into ?
    mingl0280
        17
    mingl0280  
       Mar 27, 2021 via Android
    往数据库里插存储过程呗,调用就一句了。
    l00t
        18
    l00t  
       Mar 28, 2021
    一楼就告诉你答案了……
    pppguest3962
        19
    pppguest3962  
    OP
       Mar 28, 2021
    @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  
       Mar 28, 2021   ❤️ 1
    语法错了? INSERT INTO casecheck (flag) SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
    XLeopard
        21
    XLeopard  
       Mar 28, 2021
    你这个需求用 NOT EXISTS 很适合啊
    apostle
        22
    apostle  
       Mar 28, 2021 via Android   ❤️ 1
    insert ignore into
    XLeopard
        23
    XLeopard  
       Mar 28, 2021   ❤️ 1
    INSERT INTO casecheck (flag) values('2') WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
    pppguest3962
        24
    pppguest3962  
    OP
       Mar 28, 2021
    @dvvj
    @radishear

    反复确认了 N 次,应该语法是没错的,还是不通过
    总是提示" MySQL server version for the right syntax to use near 'WHERE NOT EXISTS "
    错在 WHERE
    VALUE,VALUES 都试过了,``''这些符号都增加和删除过,有些怀疑是不是这样行不通,
    累了,准备歇一会儿,明天再继续,问题可能很弱智,也有可能是我肤浅,麻烦大家,真不好意思...
    eason1874
        25
    eason1874  
       Mar 28, 2021   ❤️ 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  
       Mar 28, 2021 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  
       Mar 28, 2021   ❤️ 1
    @songpengf117 #26 对,满足语句要求用临时表名好点,更清晰。

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

    涉及唯一列再加个 IGNORE
    zm8m93Q1e5otOC69
        28
    zm8m93Q1e5otOC69  
       Mar 28, 2021   ❤️ 1
    @pppguest3962 我这边测试了,没问题的。。看一下你数据表吧
    suanbaner
        29
    suanbaner  
       Mar 28, 2021   ❤️ 1
    二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了
    c6h6benzene
        30
    c6h6benzene  
       Mar 28, 2021 via iPhone   ❤️ 1
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2683 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 07:17 · PVG 15:17 · LAX 00:17 · JFK 03:17
    ♥ Do have faith in what you're doing.