问题:插入一条数据,判重除id的所有字段,不重复才插入。
搜索关键词: 插入数据判重非主键,https://cn.bing.com/。
由于我是判重除id外的字段,所以,按主键判重的ON DUPLICATE KEY就不考虑了。
共三种方法,第一种适合不在乎索引的情况(我用的),第二种比较笨但是最安全,第三种必须是非空表才行,不推荐。
-- 1、MySQL设置唯一索引,然后insert ignore就行了。
-- 问题:(1)返回的是插入条数,而非id,如何返回id?(2)自增id会增长!
ALTER TABLE saml_list ADD UNIQUE(members,member_classify,list_compound,exp) INSERT IGNORE saml_list(members,member_classify,list_compound,exp) VALUES ('13,0,25',1,8,'file,loff_t,int')
问题解决:(1)返回的是插入条数,而非id,如何返回id?
过程如下:
1、搜索关键词:mysql insert如何返回插入的id?spring data JPA 返回插入的id?
mysql 插入数据后返回自增 ID 的七种方法【除了Mybatis还是不行】
用insert into 插入数据后直接返回刚插入数据的ID (自增ID)【Mybatis】
@GeneratedValue(strategy = GenerationType.IDENTITY)//加上这条注解后,save方法就会返回数据库id了! 【JPA的save方法,这里原生SQL不一定适用】
2、中文不行,尝试官方API,发现找不到。尝试英文搜索:spring data jpa insert and return id。
查到这个:Returning an Auto-Generated Id with JPA
还是不行,再来:spring data jpa native sql insert and return id 。
查到:insert a data and get back ID in spring boot JPA
3、两处都提到了EntityManager,没用过,查一下吧。【未完】
-- 2、直接换成两条语句,查询是否存在,不存在插入。
-- 由于限制了limit 1,所以cout(*),不存在是0,存在是1。
-- Java处理逻辑,不连表。连表有一个问题,就是事务太长,容易出现死锁。
SELECT count(*) FROM saml_list WHERE members='13,1,25' LIMIT 1; INSERT INTO saml_list(members,member_classify,list_compound,exp) VALUES ('13,0,25',1,8,'file,loff_t,int')
-- 3、insert into ...select ...where not exists (...)
-- 问题:很奇怪的东西,只有表不空的时候才能用,表空的时候死活插不进去。
INSERT INTO saml_list(members,member_classify,list_compound,exp) SELECT '13,0,25',1,8,'file,loff_t,int' FROM saml_list WHERE NOT EXISTS ( SELECT members,member_classify,list_compound,exp FROM saml_list WHERE members='13,0,25' AND member_classify=1 AND list_compound=8 AND exp='file,loff_t,int') LIMIT 1;
INSERT INTO s(SN,SD,SA) SELECT 'user2','dep1',20 FROM s WHERE NOT EXISTS ( SELECT SN,SD,SA FROM s WHERE SN='user1' AND SD='dep1' AND SA=20 )LIMIT 1;
注意:用单引号。
在标准 SQL 中,字符串使用的是单引号。
mysql中也允许用双引号表示字符串,但是这不是标准是扩展,最好不用,oracle中只允许用单引号。
参考:
(2)在MySQL数据库中,这4种方式可以避免重复的插入数据!
作者:西伯尔
出处:http://www.cnblogs.com/sybil-hxl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。