MySQL基于条件判断的数据插入

14 sec read

在编写程序时,我们经常会遇到一些基于条件判断的逻辑,比如:判断该条数据是否已经在数据库中存在,如果不存在,则插入。

技巧一:使用ignore关键字

如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into

当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。

示例: INSERT IGNORE INTO books (name) VALUES ('MySQL Manual')

技巧二:使用replace into

REPLACE的运行与INSERT很相像, 但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:尝试把新行插入到表中,当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时从表中删除含有重复关键字值的冲突行,再次尝试把新行插入到表中。

旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。

语法格式:

示例: REPLACE INTO books SELECT 1, 'MySQL Manual' FROM books

技巧三:ON DUPLICATE KEY UPDATE

具体语法: INSERT INTO table(field1, field2, fieldn) SELECT 'field1', 'field2', 'fieldn' FROM DUAL WHERE NOT EXISTS(SELECT field FROM table WHERE field = ?)

其中的 DUAL 是一个临时表,不需要物理创建。

示例: INSERT INTO books (name) VALUES ('MySQL Manual') ON duplicate KEY UPDATE id = id

技巧四:INSERT INTO IF EXISTS

根据select的条件判断是否插入,可以不光通过primary 和unique来判断,也可通过其它条件。

示例: INSERT INTO books (name) SELECT 'MySQL Manual' FROM dual WHERE NOT EXISTS (SELECT id FROM books WHERE id = 1)

打赏作者
微信支付标点符 wechat qrcode
支付宝标点符 alipay qrcode

Chrome扩展程序代码路径

Chrome中安装了一个翻译的扩展程序,但该扩展程序对“复制”进行了监听,每次复制翻译的内容都弹出一个框要求注
8 sec read

Chrome占用大量内存的解决方法

在日常使用Chrome的过程中会发现其非常的占用内存。原因是Chrome对每个插件和浏览器标签页都新开一个单独
6 sec read

发表评论

电子邮件地址不会被公开。 必填项已用*标注