diff --git a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/mysql/MySQLInsertOnDuplicateUpdateExecutor.java b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/mysql/MySQLInsertOnDuplicateUpdateExecutor.java index e4f67ae0192..8051f10a89a 100644 --- a/rm-datasource/src/main/java/io/seata/rm/datasource/exec/mysql/MySQLInsertOnDuplicateUpdateExecutor.java +++ b/rm-datasource/src/main/java/io/seata/rm/datasource/exec/mysql/MySQLInsertOnDuplicateUpdateExecutor.java @@ -44,6 +44,7 @@ import io.seata.rm.datasource.sql.struct.Row; import io.seata.rm.datasource.sql.struct.TableMeta; import io.seata.rm.datasource.sql.struct.TableRecords; +import io.seata.rm.datasource.sql.struct.IndexMeta; import io.seata.rm.datasource.undo.SQLUndoLog; import io.seata.sqlparser.SQLInsertRecognizer; import io.seata.sqlparser.SQLRecognizer; @@ -297,7 +298,7 @@ public String buildImageSQL(TableMeta tableMeta) { int finalI = i; List paramAppenderTempList = new ArrayList<>(); tableMeta.getAllIndexes().forEach((k, v) -> { - if (!v.isNonUnique()) { + if (!v.isNonUnique() && isIndexValueNotNull(v,imageParameterMap,finalI)) { boolean columnIsNull = true; List uniqueList = new ArrayList<>(); for (ColumnMeta m : v.getValues()) { @@ -308,15 +309,6 @@ public String buildImageSQL(TableMeta tableMeta) { columnIsNull = false; continue; } - if ((imageParameters == null && m.getColumnDef() == null) || imageParameters.get(finalI) == null || imageParameters.get(finalI) instanceof Null) { - if (!"PRIMARY".equalsIgnoreCase(k)) { - columnIsNull = false; - uniqueList.add(columnName + " is ? "); - paramAppenderTempList.add("NULL"); - continue; - } - break; - } columnIsNull = false; uniqueList.add(columnName + " = ? "); paramAppenderTempList.add(imageParameters.get(finalI)); @@ -389,4 +381,17 @@ public Map> buildImageParameters(SQLInsertRecognizer r return imageParameterMap; } + private boolean isIndexValueNotNull(IndexMeta indexMeta, Map> imageParameterMap,int rowIndex) { + for (ColumnMeta columnMeta : indexMeta.getValues()) { + String columnName = columnMeta.getColumnName(); + List imageParameters = imageParameterMap.get(columnName); + if ((imageParameters == null && columnMeta.getColumnDef() == null) + || imageParameters.get(rowIndex) == null + || imageParameters.get(rowIndex) instanceof Null) { + return false; + } + } + return true; + } + }