mysql数据库Insert语句后面加ON DUPLICATE KEY UPDATE,保证唯一性

如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。

 

例如:

 

 

建表语句:

CREATE TABLE `consume_locus` (
  `rds` varchar(255) NOT NULL,
  `topic` varchar(255) default NULL,
  `createTime` datetime default NULL,
  `dtsTime` datetime default NULL,
  PRIMARY KEY  (`rds`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


sql语句:

 insert into t_tableName(topic,createTime,dtsTime,rds ) values( null,'2017-02-08 14:02:50','','' )  on duplicate key update topic = values(topic),createTime = values(createTime),dtsTime = values(dtsTime),rds = values(rds) ;


 

这可以保证主键只有一条记录。

附上一段java代码,算是工具类。根据传入BEAN生成SQL语句。

package dbTest;

import java.util.Map;

public class DbBean {
	//列名和列值
	private Map fieldMap;
	//表名
	private String tablename;
	public Map getFieldMap() {
		return fieldMap;
	}
	public void setFieldMap(Map fieldMap) {
		this.fieldMap = fieldMap;
	}
	public String getTablename() {
		return tablename;
	}
	public void setTablename(String tablename) {
		this.tablename = tablename;
	}
	
}


 

public class testDB {
	
	public static void main(String args[]) throws InterruptedException{
		String createTimeStr=DateUtil.dateToStr(new Date(), DateUtil.YYYYMMDDHHMMSS2);
		Map fieldMap=new HashMap();
		fieldMap.put("rds", ClusterClientCore.rdsCode);
		fieldMap.put("topic", ClusterClientCore.topic);
		fieldMap.put("createTime", createTimeStr);
		fieldMap.put("dtsTime", ClusterClientCore.dtsTimestamp);
		DbBean bean =new DbBean();
		bean.setFieldMap(fieldMap);
		bean.setTablename("t_tableName");
		String sql=getInsertSqlStr(bean);
			System.out.println(sql);
	}
	
	/**
	 * 把bean转换为sql语句
	 * @param bean
	 * @return
	 */
	public static String getInsertSqlStr(DbBean bean){
		StringBuffer columName=new StringBuffer();
		StringBuffer columValue=new StringBuffer();
		//幂等操作
		StringBuffer duplicateSb=new StringBuffer();
		Map fieldMap=bean.getFieldMap();
		Iterator it=fieldMap.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry entry=(Map.Entry)it.next();
			String key=entry.getKey();
			duplicateSb.append(key).append(" = values(").append(key).append("),");
			columName.append(key).append(",");
			if(entry.getValue()!=null){
			String value=(String)entry.getValue();
			columValue.append("'").append(value).append("'").append(",");
			}else{
				columValue.append(entry.getValue()).append(",");
			}
		}
		String columNameStr=columName.deleteCharAt(columName.length()-1).toString();
		String columValueStr=columValue.deleteCharAt(columValue.length()-1).toString();
		String sqlStr="insert into "+ bean.getTablename()+"("+columNameStr+" ) values( "+columValueStr+" ) ";
		String duplicateStr=" on duplicate key update "+duplicateSb.deleteCharAt(duplicateSb.length()-1).toString()+" ;";
		return sqlStr+duplicateStr;
	}
}


 

 

你可能感兴趣的:(JAVA)