› 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
qazwsxkevin
V2EX  ›  MySQL

这个 Mysql 的语句,逻辑上错在哪里?

  •  
  •   qazwsxkevin · May 12, 2021 · 3476 views
    This topic created in 1969 days ago, the information mentioned may be changed or developed.
    INSERT INTO `PMnotyet`(`LName`, `type`, `pmid`) VALUES ('Jay', '1', '55') WHERE (EXISTS SELECT id FROM NickNametbl WHERE `pmff`='1' AND `LName`='CN') OR (NOT EXISTS SELECT id FROM NickNametbl WHERE `LName`='CN' LIMIT 1)
    

    上面的语句是失败的,请教正确的语句逻辑应该是怎么样?

    实现目标的中文表达是:
    1 、如果在 NickNametbl 表中,可以找到以下内容,
    SELECT id FROM NickNametbl WHERE pmff='1' AND LName='CN';

    2 、如果未能在 NickNametbl 表中找到内容,
    SELECT id FROM NickNametbl WHERE LName='CN' LIMIT 1;

    1 和 2 是或的关系

    3 、如果 1 或者 2 成立,就执行:
    INSERT INTO PMnotyet(LName, type, pmid) VALUES ('Jay', '1', '55')

    9 replies  •  2021-05-13 10:57:49 +08:00
    bootvue
        1
    bootvue  
       May 12, 2021
    ```sql
    INSERT INTO `PMnotyet`(`LName`, `type`, `pmid`) VALUES ('Jay', '1', '55') WHERE EXISTS ( SELECT id FROM NickNametbl WHERE `pmff`='1' AND `LName`='CN') OR NOT EXISTS ( SELECT id FROM NickNametbl WHERE `LName`='CN' LIMIT 1)
    ```

    这个样子试一试
    ChoateYao
        2
    ChoateYao  
       May 12, 2021
    INSERT INTO 不支持 where,我以为是 8.0 新特性,但是去查下 8.0 文档并没有支持该语法。

    https://dev.mysql.com/doc/refman/8.0/en/insert.html
    qazwsxkevin
        3
    qazwsxkevin  
    OP
       May 12, 2021
    @bootvue 加括号也不行

    @ChoateYao 也许这就是原因了吧,


    难道只能在本端程序,多次与 Mysql 来回沟通才能完成这个事情?
    kzm
        4
    kzm  
       May 12, 2021
    INSERT INTO `PMnotyet`(`LName`, `type`, `pmid`) select 'Jay', '1', '55' from dual WHERE EXISTS ( SELECT id FROM NickNametbl WHERE `pmff`='1' AND `LName`='CN') OR NOT EXISTS ( SELECT id FROM NickNametbl WHERE `LName`='CN' LIMIT 1) 试试
    lybcyd
        5
    lybcyd  
       May 12, 2021
    insert into 没有直接加 where 的语法。你可以把第一个 where 改成 select,根据第二个 where 的条件来生成结果,再将后半部分的结果直接插入 PMnotyet 表。另外你后面的语句也有点错误,需要调整一下。

    INSERT INTO
    `PMnotyet`(`LName`, `type`, `pmid`)
    SELECT
    'Jay',
    '1',
    '55'
    WHERE
    EXISTS(
    SELECT
    id
    FROM
    NickNametbl
    WHERE
    `pmff` = '1'
    AND `LName` = 'CN'
    )
    OR NOT EXISTS(
    SELECT
    id
    FROM
    NickNametbl
    WHERE
    `LName` = 'CN'
    LIMIT
    1
    )

    亲测可以生效
    lybcyd
        6
    lybcyd  
       May 12, 2021
    排版不太容易看,重新贴一下

    ```sql
    INSERT INTO
    `PMnotyet`(`LName`, `type`, `pmid`)
    SELECT
    'Jay', '1', '55'
    WHERE
    EXISTS(SELECT id FROM NickNametbl WHERE `pmff` = '1' AND `LName` = 'CN')
    OR NOT EXISTS(SELECT id FROM NickNametbl WHERE `LName` = 'CN' LIMIT 1)
    ```
    controller
        7
    controller  
       May 12, 2021
    要么和 4 楼一样用 dual 表,要么写 sql 的 if ()then 解决,不过这样都是在插入语句内写入了查询,加大了主库的压力,主库应该尽可能的减少查询压力。如果是我,我选择表内设计唯一约束解决
    xuanbg
        8
    xuanbg  
       May 12, 2021
    正常 select 能出来结果集就行。INSERT INTO `PMnotyet`(`LName`, `type`, `pmid`) select `LName`, `type`, `pmid` from NickNametbl where ……
    CodeUtils
        9
    CodeUtils  
       May 13, 2021
    INSERT INTO `PMnotyet`(`LName`, `type`, `pmid`)
    SELECT LName, type, pmid
    FROM NickNametbl
    WHERE EXISTS(SELECT id FROM NickNametbl WHERE `pmff` = '1' AND `LName` = 'CN')
    OR NOT EXISTS(SELECT id FROM NickNametbl WHERE `LName` = 'CN');
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2226 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 04:34 · PVG 12:34 · LAX 21:34 · JFK 00:34
    ♥ Do have faith in what you're doing.