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 · 86 天前 · 2550 次点击
    这是一个创建于 86 天前的主题,其中的信息可能已经有所发展或是发生改变。

    老旧系统,历史原因,因为提交接口是一个 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   86 天前   ❤️ 2
    insert tab(a,b,c) select 1,2,3

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

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

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

    涉及唯一列再加个 IGNORE
    beichenhpy
        28
    beichenhpy   86 天前   ❤️ 1
    @pppguest3962 我这边测试了,没问题的。。看一下你数据表吧
    suanbaner
        29
    suanbaner   86 天前   ❤️ 1
    二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了
    c6h6benzene
        30
    c6h6benzene   86 天前 via iPhone   ❤️ 1
    关于   ·   帮助文档   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2579 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 11:18 · PVG 19:18 · LAX 04:18 · JFK 07:18
    ♥ Do have faith in what you're doing.