2010-03-12 36 views
5

Tôi đang sử dụng Java, Spring (NamedParameterJdbcTemplate) và MySQL. tuyên bố của tôi trông như thế này:Làm thế nào để chèn vào hai bảng khác nhau trong một câu lệnh với Java và MySQL?

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

Nhưng nó được ném các lỗi sau:

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

ngoại lệ lồng nhau là:

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

Cú pháp hoạt động tốt trong MySQL nhưng có điều gì đó sẽ kết thúc khi kết hợp qua mẫu Spring.

Cảm ơn!

Trả lời

0

Bạn cần thực hiện từng câu lệnh riêng biệt. Đầu tiên, chèn vào table1, sau đó chèn vào table2

+1

Không, tôi không! Tôi muốn xếp hàng chúng, tôi đã có 100.000 miếng chèn để làm, đó là lý do tại sao tôi cần phải làm điều đó trong một tuyên bố – MalcomTucker

5

Sử dụng phương pháp addBatch để chạy nhiều báo cáo

 

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

Người tài xế MySQL JDBC không hỗ trợ nhiều báo cáo phân cách bằng ';', ngay cả khi bản thân máy khách MySQL. Bạn không thể phụ thuộc vào điều đó nếu bạn phải làm điều này với Java.

Nếu bạn có 100 nghìn bản ghi, bạn có chắc chắn Java là công cụ phù hợp cho công việc không? Tôi tự hỏi nếu công cụ nhập khẩu MySQL hoặc ETL sẽ tốt hơn nếu đây là một công việc hàng loạt.

Ngoài ra, mô-đun lô mùa xuân là gì? Liệu nó có bất cứ điều gì đặc biệt được thực hiện cho vấn đề này?

+0

ok, vì vậy đó là câu trả lời tôi đã theo sau (hoặc không, nhưng nó đã trả lời câu hỏi của tôi!). vấn đề tôi có là lấy id được chèn từ bảng đầu tiên cho lần chèn tiếp theo. tại thời điểm này tôi phải thực hiện một lần tại một thời điểm - là có một kỹ thuật để ghép hai chèn liên quan như thế này? – MalcomTucker

+0

Thử xem java.sql.Statement.getGeneratedKeys.Nó sẽ là INSERT, getGeneratedKeys, INSERT trong một đơn vị công việc. Hãy chắc chắn rằng bạn làm điều đó trong một giao dịch duy nhất. Bạn biết cách giao dịch, đúng không? – duffymo

+0

Không sao cả - tôi có thể trả lại hàng loạt không? – MalcomTucker

0

bạn có bỏ lỡ dấu chấm phẩy hay không; trong câu lệnh thứ hai. Tôi nghĩ rằng đây là một lỗi cú pháp hơn bất cứ điều gì khác.

thử chạy hai lệnh trên bảng điều khiển mysql và se nếu cú ​​pháp là chính xác.

Tôi luôn chạy đồng bộ trên bảng điều khiển để đảm bảo sytax.

3

Đối với bất cứ ai muốn thực hiện nhiều câu lệnh từ JdbcTemplate với MySQL mà không sử dụng cập nhật hàng loạt: "allowMultiQueries = true"

Thêm vào cuối url (xem ví dụ dưới đây).

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

Thử nghiệm với phương pháp jdbcTemplate.execute, Spring 3.0.2 và MySQL lái xe v5.1.9

<dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.9</version> 
    </dependency> 
Các vấn đề liên quan