Пакетные операторы против вставки нескольких значений

#java #sql #jdbc

#java #sql #jdbc

Вопрос:

JDBC имеет функцию группирования нескольких запросов в одном едином блоке и передачи его за один сетевой переход к базе данных.

Как показано в этом примере кода:

 String[] EMPLOYEES = new String[]{"Zuck","Mike","Larry","Musk","Steve"};
String[] DESIGNATIONS = new String[]{"CFO","CSO","CTO","CEO","CMO"};

String insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?)";
PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL);

for(int i = 0; i < EMPLOYEES.length; i  ){
    String employeeId = UUID.randomUUID().toString();
    employeeStmt.setString(1,employeeId);
    employeeStmt.setString(2,EMPLOYEES[i]);
    employeeStmt.setString(3,DESIGNATIONS[i]);
    employeeStmt.addBatch();
}
employeeStmt.executeBatch();
 

Но в SQL у нас есть возможность использовать вставки со многими группами ЗНАЧЕНИЙ, как в:

 String[] EMPLOYEES = new String[] {"Zuck","Mike","Larry","Musk","Steve"};
String[] DESIGNATIONS = new String[] {"CFO","CSO","CTO","CEO","CMO"};

StringBuilder insertEmployeeSQL = "INSERT INTO EMPLOYEE(ID, NAME, DESIGNATION) VALUES (?,?,?)"
      ", (?, ?, ?)".repeat(EMPLOYEES.length - 1);

PreparedStatement employeeStmt = connection.prepareStatement(insertEmployeeSQL.toString());

int columnIndex = 0;
for(int i = 0; i < EMPLOYEES.length; i  ){
    String employeeId = UUID.randomUUID().toString();
    employeeStmt.setString(  columnIndex, employeeId);
    employeeStmt.setString(  columnIndex, EMPLOYEES[i]);
    employeeStmt.setString(  columnIndex, DESIGNATIONS[i]);
}

employeeStmt.execute();
 

Что мне нужно знать, так это в чем разница между этими двумя подходами?

Obs:

Первый пример взят отсюда https://www.baeldung.com/jdbc-batch-processing а второй отредактирован мной. Английский не мой родной язык, и это мой первый пост, так что извините за что угодно.

Ответ №1:

INSERT с несколькими VALUES блоками, т. Е. Несколькими (val, ...) блоками, недопустимый синтаксис SQL. О, конечно, некоторые базы данных могут поддерживать этот расширенный синтаксис, но не все из них.

Даже если ваша база данных это делает, использование этого синтаксиса значительно увеличит количество параметров оператора, и все базы данных имеют ограничение на количество разрешенных параметров в одном запросе. Фактический предел зависит от базы данных. Пакетирование не имеет ограничения на размер пакета, кроме объема памяти для хранения всех значений.

Комментарии:

1. Вставка с несколькими значениями, безусловно, является допустимым синтаксисом SQL, он определен в ISO-9075-2: 2016 (стандарт SQL), в частности, в 14.11 <инструкция insert> в сочетании с 7.3 <конструктор значений таблицы>. Просто некоторые системы баз данных не поддерживают конструктор табличных значений (предложение values) как таковой и поддерживают только более простой вариант предложения values с одной строкой.