MySQL中,如果存在数据重复插入的情况,我们一般通过数据库CAID理论中的“一致性(Consistency)”特性来保证。
即:UNIQUE index or PRIMARY KEY
1、INSERT or UPDATE
我们可以通过“INSERT ... ON DUPLICATE KEY UPDATE Syntax”来实现。
2、INSERT or SELECT
即:不知道待插入数据是否已经存在。如果不存在的话,插入数据并查询;如果存在的话,查询。
字段“field”设置唯一索引:UNIQUE index
这里存在的写法1:
// 查询是否已存在
Object data = Statement.execute("select * from table where field = 'val'");
if (null != data) {
return data;
}
else {
// 不存在则插入
Statement.execute("insert into table (field) values ('val')", Statement.RETURN_GENERATED_KEYS);
// 获取自动生成的主键
int id = getGeneratedPrimaryKey(Statement);
inputData.id = id;
return inputData;
}
感觉略别扭,并且可能存在并发导致insert失败,导致程序出现异常。
换个写法2:
使用:INSERT IGNORE INTO语法,INSERT IGNORE INTO 与INSERT INTO的区别就是INSERT IGNORE INTO会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据。
// 使用insert IGNORE,即使出现UNIQUE index冲突,依然能正常执行
Statement.execute("insert IGNORE into table (field) values ('val')");
Object data = Statement.execute("select * from table where field = 'val'");
return data;
感觉简洁明了了很多。over~