Как вставить в две различных таблицы в один оператор с Java и MySQL?

Я использую Java, Spring (NamedParameterJdbcTemplate) и MySQL. Мой оператор похож на это:

INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())

Но это бросает следующую ошибку:

PreparedStatementCallback; bad SQL grammar [INSERT INTO Table1 (Name) VALUES (?);
INSERT INTO Table2 (Path, Table1Id) VALUES (?, LAST_INSERT_ID())] `

Вложенная исключительная ситуация:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO Table2 (Path, Table1Id' at line 1

Синтаксис хорошо работает в MySQL, но что-то произошло при объединении через шаблон Spring.

Спасибо!

5
задан MalcomTucker 12 March 2010 в 00:25
поделиться

5 ответов

Используйте метод addBatch для запуска нескольких операторов


Statement stmt = con.createStatement();
   stmt.addBatch(
    "update registration set balance=balance-5.00
        where theuser="+theuser);
   stmt.addBatch(
    "insert into auctionitems(
                   description, startprice) 
        values("+description+","+startprice+")");

   int[] results = stmt.executeBatch();

source

5
ответ дан 14 December 2019 в 01:06
поделиться

вы пропустили точку с запятой; во втором заявлении. Я думаю, что это синтаксическая ошибка, чем что-либо еще.

попытка запустить две команды на консоли mysql и se, если синтаксис правильный.

Я всегда запускаю команду на консоли, чтобы убедиться, что sytax.

0
ответ дан 14 December 2019 в 01:06
поделиться

Драйвер MySQL JDBC не поддерживает несколько операторов, разделенных символом ';', даже если это делает сам клиент MySQL. Вы не можете полагаться на это, если вам нужно делать это с помощью Java.

Если у вас 100 000 записей, уверены ли вы, что Java - подходящий инструмент для работы? Мне было бы интересно, были бы лучше инструменты импорта MySQL или ETL, если бы это было пакетное задание.

А как насчет пакетного модуля Spring? Есть ли что-нибудь специально для этой проблемы?

1
ответ дан 14 December 2019 в 01:06
поделиться

Вам нужно выполнять каждую инструкцию отдельно. Сначала вставьте в table1, затем вставьте в table2

0
ответ дан 14 December 2019 в 01:06
поделиться

Для тех, кто хочет выполнять несколько операторов из jdbcTemplate с MySQL без использования пакетного обновления:

Добавить «? AllowMultiQueries = true "в конце URL-адреса (см. пример ниже).

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/tt?allowMultiQueries=true" />
    <property name="username" value="root" />
    <property name="password" value="" />
</bean>

Протестировано с помощью метода jdbcTemplate.execute, Spring 3.0.2 и драйвера MySQL v5.1.9

    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.9</version>
    </dependency>
3
ответ дан 14 December 2019 в 01:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: