mysql判断表记录是否存在,不存在则插入新纪录

摘要:
将express替换为表达式或函数,并从dual where条件#中选择表达式。此sql仅向上述扩展名添加where条件。执行时,首先判断where子句是否有效,然后在select中执行express,最后返回express执行的值;如果where子句不存在,则返回null。例如,如果从1=1中选择1+1,则将返回2。为了解决这个问题,您可以先选择,然后根据结果决定是否继续写入数据库。

开始以为和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判断表记录是否存在,不存在则插入新纪录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇gcc编译linux/ubuntu下free查看内存占用大的解释_乌哥的家常菜_百度空间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

MySql cmd下的学习笔记 —— 有关多表查询的操作(多表查询练习题及union操作)

先建立一张 m 表 mysql> create table m ( -> mid int, -> hid int, -> gid int, -> mres varchar(10), -> matime date -> )engine myisam charset u...

mssql语句精华指令

常用sql语句 1. 查看数据库的版本 select @@version 2. 查看数据库所在机器操作系统参数 exec master..xp_msver 3. 查看数据库启动的参数 sp_configure 4. 查看数据库启动时间 select convert(varchar(30),login_time,120) from master..syspr...

mysql——导入文本文件——用mysqlimport命令

CMD进入DOS窗口执行: mysqldump -u root -p123 -T C:\Users\del\Desktop see cr01 --fields-terminated-by=',' --lines-terminated-by='\r\n' mysqlimport -u root -p123 see C:\Users\del\Deskto...

在perl上装DBD:mysql 的问题

在perl上装DBD:mysql ,就这事弄了多半天。mysql实在是不咋地 首先,在装DBD:mysql模块时,make后打印出错误信息,如下:gcc: language strconst not recognized gcc: dbdimp.c: linker input file unused because linking not done gcc...

js给select下拉框赋值触发change事件

感谢作者的无私分享! 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本文链接:https://blog.csdn.net/Tong__wei/article/details/96289555HTML: <select οnchange="selectChange()">     <...

从 SQL Server 到 MySQL (一):异构数据库迁移

背景 沪江成立于 2001 年,作为较早期的教育学习网站, 当时技术选型范围并不大: Java 的版本是 1.2,C# 尚未诞生,MySQL 还没有被 Sun 收购, 版本号是 3.23。 工程师们选择了当时最合适的微软体系,并在日后的岁月里, 逐步从 ASP 过度到 .net,数据库也跟随 SQL Server 进行版本升级。 十几年过去了,技术社区已经...