2010-03-12 10 views
5

Używam Java, Spring (NamedParameterJdbcTemplate) i MySQL. Moje oświadczenie wygląda następująco:Jak wstawić do dwóch różnych tabel w jednym oświadczeniu z Java i MySQL?

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

Ale to jest rzucanie się następujący błąd:

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

Zagnieżdżony Wyjątkiem jest:

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

Składnia działa poprawnie w MySQL, ale coś jest nie tak podczas łączenia za pomocą szablonu Spring.

Dzięki!

Odpowiedz

0

Należy wykonać każdą instrukcję osobno. Po pierwsze, wstawić Tabela1, a następnie wstawić do Table2

+1

Nie, nie! Chcę je wsypać, mam 100 000 wkładek do zrobienia, dlatego muszę to zrobić w jednym oświadczeniu – MalcomTucker

5

Użyj metody addBatch uruchomić wiele instrukcji

 

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

1

Sterownik JDBC MySQL nie obsługuje wielu wypowiedzi oddzielone ';', nawet jeśli sam klient MySQL to robi. Nie możesz na tym polegać, jeśli musisz to zrobić w Javie.

Jeśli masz rekordy 100K, czy na pewno Java jest właściwym narzędziem do pracy? Zastanawiam się, czy narzędzia do importowania MySQL lub ETL będą lepsze, jeśli jest to zadanie wsadowe.

Co się tyczy wiosennego modułu wsadowego? Czy ma coś specjalnie stworzonego do tego problemu?

+0

ok, więc to jest odpowiedź, której szukałem (lub nie, ale odpowiedź na moje pytanie!). problemem, który mam, jest uzyskanie wstawionego identyfikatora z pierwszej tabeli dla kolejnej wkładki. w tej chwili mam wykonać jeden na raz - czy istnieje technika do grupowania dwóch powiązanych wstawek w ten sposób? – MalcomTucker

+0

Spróbuj spojrzeć na java.sql.Statement.getGeneratedKeys.Będzie to INSERT, getGeneratedKeys, INSERT w jednej jednostce pracy. Upewnij się, że robisz to w pojedynczej transakcji. Wiesz, jak robić transakcje, prawda? – duffymo

+0

Tak, nie ma problemu - czy mogę zwrócić je masowo? – MalcomTucker

0

Czy tęskniłeś za średnikiem; w drugim stwierdzeniu. Myślę, że jest to błąd składniowy niż cokolwiek innego.

próbuje uruchomić tam dwa polecenia na konsoli mysql i se, jeśli składnia jest poprawna.

Zawsze uruchamiam podpórkę na konsoli, aby upewnić się, że sytax.

3

Dla każdego, kto chce wykonywać wiele sprawozdań z jdbcTemplate z MySQL bez użycia aktualizacji partii: „allowMultiQueries = true”

dodany na końcu adresu URL (patrz przykład poniżej).

<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> 

Testowany metodą jdbcTemplate.execute, Spring 3.0.2 i MySQL kierowcy v5.1.9

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.9</version> 
    </dependency> 
Powiązane problemy