开始以为和SQL Server一样,使用not exists进行判断,结果不行:

IF NOT EXISTS (SELECT 1 FROM vrv_paw_template WHERE templateName='自定义' OR templateFileName='policycustom' LIMIT 1)
INSERT INTO vrv_paw_template(templateName,templateFileName,createTime,updateTime) VALUES('自定义','policycustom',NOW(),NOW());
END IF

正确的写法:

INSERT INTO vrv_paw_template(templateName,templateFileName,createTime,updateTime)
SELECT '自定义','policycustom',NOW(),NOW()
FROM DUAL WHERE NOT EXISTS (
SELECT 1 FROM vrv_paw_template WHERE templateName='自定义' OR templateFileName='policycustom' LIMIT 1
);

注释:dual 是个临时表

mysql官方对这个表的解释吧(http://dev.mysql.com/doc/refman/5.0/en/select.html):

DUAL is purely for the convenience of people who require that all SELECT statements should have FROM and possibly other clauses. MySQL may ignore the clauses. MySQL does not require FROM DUAL if no tables are referenced.

官方的解释说:纯粹是为了满足select … from…这一习惯问题,mysql会忽略对该表的引用。

把我发现的三个应用地方都加上:
    select express from dual #这条sql就类似上面的查看系统时间一样。把express替换成表达式或函数就行
    select express from dual where condition #这条sql只是对上面的一点扩展 加上一个where条件。其实这个where条件跟我们平时使用的where条件没什么区别。执行的时候也是先判断where子句是否成立,满足然后再执行select中的express,最后返回express执行的值;如果where子句不成立,则返回空。比如:select 1+1 from where 1=1,将返回2。
    第三个就是一条比较实用的SQL语句了!你否想过:插入数据时先判断一下这条 记录是否已存在这个问题!?也许很多时候为了解决这个问题,你会先select一下,根据他的结果再决定是否继续写入数据库。但是用dual这个表,可以让你仅一条SQL就可以解决这个问题哦!
    SQL就是这样写的:

INSERT INTO table  (primarykey, field1, field2, ...)  SELECT key, value1, value2, ...  FROM dual  WHERE not exists (select * from table where primarykey = id);

mysql判断表记录是否存在,不存在则插入新纪录的更多相关文章

  1. mysql语句判断是否存在记录,没有则插入新纪录否则不执行

    1 前言 由于项目需要,当某个表如果有记录,就不执行加入语句,否则加入新纪录(测试数据).思路是:判断表的记录是否为空,然后再决定是否插入 2 代码 DROP PROCEDURE IF EXISTS ...

  2. mysql 删除表记录 delete和truncate table区别

    MySQL中删除表记录delete from和truncate table的用法区别: mysql中有两种删除表中记录的方法: (1)delete from语句, (2)truncate table语 ...

  3. 设置mysql数据表列自动递增以及数据行插入操作

    创建mysql数据表,设置id列递增.主键create table running_log ( id int primary key auto_increment, routename varchar ...

  4. navicat查看mysql数据表记录数不断变化

    在使用navicat进行数据库管理的时候,在查看表对象的时候会发现,每次刷新,数据表的记录数不断变化,尤其是大表. 对于100万的数据经常会显示九十几万,当然通过count(*)出来的数据是正确的. ...

  5. mySQL 判断表是否存

    select `TABLE_NAME` from `INFORMATION_SCHEMA`.`TABLES` where `TABLE_SCHEMA`='数据库名' and `TABLE_NAME`= ...

  6. mysql 查看表记录新增、修改的时间

    ALTER TABLE `tableName` ADD `updateAt` TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP; ALTER TABLE kd_up ...

  7. mysql 复制表结构 / 从结果中导入数据到新表

    这只会复制结构: mysql> create table a like mysql1; Query OK, 0 rows affected (0.03 sec) mysql> desc a ...

  8. MySQL判断字段值来确定是否插入新记录

    今天正好有个新需求,要求在一张表中,保证不插入重复的记录. 即,保证每条记录中的某个字段的值不重复. 下面是我给出的SQL语句: //存在-->更新 //不存在-->插入 UPDATE 表 ...

  9. MySQL单表数据量过千万,采坑优化记录,完美解决方案

    问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死.严重影响业务 ...

随机推荐

  1. TimeUnit简析

    TimeUnit是java.util.concurrent包下面的一个类,主要有两种功能: 1.提供可读性更好的线程暂停操作,通常用来替换Thread.sleep() 2.提供便捷方法用于把时间转换成 ...

  2. 20144303石宇森《网络对抗》MSF基础应用

    20144303石宇森<网络对抗>MSF基础应用 实验后回答问题 一.解释什么是exploit,payload,encode: 我认为exploit就是一个简单的攻击指令,就是对配置所有设 ...

  3. Java JDK8 学习笔记 1-3章

    第一章 Java平台概论 1.了解Java的前世今生,Java SE.Java EE.JavaME三大平台.其中Java SE主要由四部分JVM.JRE.JDK与Java语言,JDK包含JRE,JRE ...

  4. SQL NULL

    表 select CHARACTER_MAXIMUM_LENGTH from information_schema.columns where table_name= 'Alliance' selec ...

  5. Luogu P1533 可怜的狗狗

    题目链接:https://www.luogu.org/problemnew/show/P1533 没人写$fhq\ treap$做法,那我就补一篇qwq 看到这题第一时间想主席树,然后发现我还没学主席 ...

  6. 【异常记录(11)】 Web应用程序项目 已配置为使用 IIS。无法访问 元数据库。您没有足够的特权访问计算机上的 IIS 网站

    解决办法: 1.项目上右键, 编辑 xxxx.csproj 2.找到  <UseIIS> 标签, 改为 <UseIIS>False</UseIIS> 3.右键,重新 ...

  7. tornado 如何向html传list变量啊?

    py: html:

  8. python 时间元组转可视化时间

    >>> import time >>> time.asctime() 'Fri Jan 4 11:17:20 2019' >>> time.asc ...

  9. Selenium UI自动化测试 Selenium Automatic Testing

    https://www.cnblogs.com/sunada2005/archive/2013/12/22/3486314.html UI Automatic Testing 1. 什么样的项目适合自 ...

  10. 《剑指offer》第十三题(机器人的运动范围)

    // 面试题:机器人的运动范围 // 题目:地上有一个m行n列的方格.一个机器人从坐标(0, 0)的格子开始移动,它 // 每一次可以向左.右.上.下移动一格,但不能进入行坐标和列坐标的数位之和 // ...