在编写程序时,我们经常会遇到一些基于条件判断的逻辑,比如:判断该条数据是否已经在数据库中存在,如果不存在,则插入。
技巧一:使用ignore关键字
如果是用主键primary或者唯一索引unique区分了记录的唯一性,避免重复插入记录可以使用: insert ignore into
当插入数据时,如出现错误时,如重复数据,将不返回错误,只以警告形式返回。所以使用ignore请确保语句本身没有问题,否则也会被忽略掉。
示例: INSERT IGNORE INTO books ( name ) VALUES ( 'MySQL Manual' )
技巧二:使用replace into
REPLACE的运行与INSERT很相像, 但是如果旧记录与新记录有相同的值,则在新记录被插入之前,旧记录被删除,即:尝试把新行插入到表中,当因为对于主键或唯一关键字出现重复关键字错误而造成插入失败时从表中删除含有重复关键字值的冲突行,再次尝试把新行插入到表中。
旧记录与新记录有相同的值的判断标准就是:表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义。该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行。
语法格式:
REPLACEINTO `table_name`(`col_name`, ...) VALUES (...);
REPLACEINTO `table_name` (`col_name`, ...) SELECT ...;
REPLACEINTO `table_name` SET `col_name`='value'
示例: 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 )