MySQL 避免重复插入时如何写SQL
table示例:chi_variant_words_lib(中文变义词词表)
假设红色部分为我在代码中需要插入的部分。
说明:下面的SQL语句示例是我用于Python中的代码片段,所以使用了%s的写法,如果直接写SQL或想要在其他语言中使用只需稍作修改。
方式1:使用ignore关键字
INSERT IGNORE INTO chi_variant_words_lib (original_word, variant_word, is_need_validated, createTime) VALUES (%s,%s,%s, NOW())
注意:使用该方法有前提条件,即插入的记录必须有用主键primary或者唯一索引unique区分了记录的唯一性的字段。
方法2:使用insert … select … where not exist及虚表dual
INSERT INTO chi_variant_words_lib (original_word, variant_word, is_need_validated, createTime) SELECT %s, %s, %s, NOW() FROM DUAL WHERE NOT EXISTS (SELECT * FROM chi_variant_words_lib WHERE original_word=%s AND variant_word=%s)
注意:这里插入时可以不光是通过primary 和unique来判断,也可通过其它非唯一性字段进行是否需要插入的判断。这种方法更通用,也比较符合我上面的插入需求,所以我最后在代码中采用的此方法。