首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果不存在,就不能工作

如果不存在,就不能工作
EN

Stack Overflow用户
提问于 2016-03-05 21:05:16
回答 2查看 1.8K关注 0票数 2
代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM `user` WHERE `name`='Rutvij' AND `lang`='python')
    BEGIN
        INSERT INTO `user` VALUES ('Rutvij', 'python', 25)
    END
ELSE
    BEGIN
        UPDATE user SET `name`='Kanzaria' WHERE `name`='Rutvij'
    END

我正在phpmyadmin sql区域中尝试上述查询。我在用xampp。它正在抛出错误,声明

1064 -您的SQL语法有错误;请检查与您的MySQL服务器版本相对应的手册,以便在第1行中正确使用“如果存在”(选择*来自用户)选择名称。

我也尝试了下面的代码

代码语言:javascript
复制
IF NOT EXISTS(SELECT * FROM user WHERE name='Rutvij' AND lang='python')
    BEGIN
        INSERT INTO user VALUES ('Rutvij', 'python', 25)
    END
ELSE
    BEGIN
        INSERT INTO user VALUES ('Kanzaria', 'python', 25)
    END

挣扎了这么久。帮帮忙吧。谢谢!!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-05 21:40:01

MySQL不允许if逻辑,除非您处于编程块(存储过程、触发器或函数)中。

幸运的是,您可以对WHERE逻辑执行相同的操作:

代码语言:javascript
复制
INSERT INTO user 
    SELECT 'Rutvij', 'python', 25
    FROM DUAL
    WHERE NOT EXISTS (SELECT 1 FROM user WHERE name = 'Rutvij' AND lang = 'python')
    UNION ALL
    SELECT 'Kanzaria', 'python', 25
    FROM DUAL
    WHERE EXISTS (SELECT 1 FROM user WHERE name = 'Rutvij' AND lang = 'python');

MySQL应该在INSERT之前处理SELECT,因此应该只插入一行。

或者,您可以将其作为两个INSERT,但顺序相反:

代码语言:javascript
复制
INSERT INTO user 
    SELECT 'Kanzaria', 'python', 25
    FROM DUAL
    WHERE EXISTS (SELECT 1 FROM user WHERE name = 'Rutvij' AND lang = 'python');

INSERT INTO user 
    SELECT 'Rutvij', 'python', 25
    FROM DUAL
    WHERE NOT EXISTS (SELECT 1 FROM user WHERE name = 'Rutvij' AND lang = 'python');
票数 4
EN

Stack Overflow用户

发布于 2016-03-05 21:20:59

这不是一个查询,这将是一个带有控制流逻辑的sql脚本,它不允许在mysql之外存储程序(过程、函数、触发器)。即使您将上述代码封装到存储过程中,它也不会工作,因为exist / not只能在子查询中使用。

我要做以下几点:

  1. 创建一个存储过程
  2. 声明整数变量
  3. 使用选择成name='Rutvij' AND lang='python'中的行数提取到变量中。
  4. 使用if语句根据记录数进行插入。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35819895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档