2011-08-24 12 views
14

tôi đã tự hỏi nếu nó có thể thực hiện nhiều câu lệnh sql trong 1 đi. Ví dụ kịch bản mà tôi muốn xóa các hàng từ nhiều bảng, là có một cách tôi có thể làm những việc như ..MyBatis thực thi nhiều câu lệnh sql trong một lần, có thể không?

<delete id="delete" parameterType="String"> 
    DELETE FROM DUMMYTABLE_A where X=${value} 
    DELETE FROM DUMMYTABLE_B where X=${value} 
</delete> 

Trả lời

14

Vâng, hầu hết các cơ sở dữ liệu cho phép điều này. Thông thường bạn phải phân định các câu lệnh SQL của mình bằng một cái gì đó. Trong PostGRES và MySQL nó là dấu chấm phẩy (;). Trong máy chủ Microsoft SQL, bạn nên sử dụng từ khóa GO. [Tháng 5 năm 2013 Cập nhật: Kể từ SQL Server 2012, bạn có thể và nên sử dụng dấu chấm phẩy để phân tách các câu lệnh của mình. Sau SQL Server 2012 (tức là phiên bản tiếp theo và hơn thế nữa) chúng sẽ là bắt buộc. Sử dụng GO bây giờ là cách không dùng nữa để làm những việc trong SQL2012 và hơn thế nữa). ]

/Postgres MySQL dụ:

DELETE FROM DUMMYTABLE_A where X=${value}; 
DELETE FROM DUMMYTABLE_B where X=${value}; 
DELETE FROM DUMMYTABLE_C where X=${value}; 

MS-SQL Ví dụ:

DELETE FROM DUMMYTABLE_A where X=${value} 
GO 
DELETE FROM DUMMYTABLE_B where X=${value} 
GO 
DELETE FROM DUMMYTABLE_C where X=${value} 

Better cơ sở dữ liệu (tức là không MySQL.) Cũng sẽ hỗ trợ các giao dịch với BEGIN TRAN/COMMIT TRAN/ROLLBACK TRAN . Sử dụng các giao dịch bạn thực sự có thể bó tất cả các câu lệnh thành một hoạt động nguyên tử, trong đó nếu một phần của nó thất bại, cả ba sẽ được khôi phục. Xem http://www.sqlteam.com/article/introduction-to-transactions để biết thêm thông tin về những thông tin đó.

Rất có thể tất cả những gì bạn cần là dấu chấm phẩy giữa các câu lệnh SQL của bạn!

+1

Tôi không biết nhưng điều này không hiệu quả đối với tôi Tôi đính kèm gist tiếp theo https://gist.github.com/AdelinGhanaem/b565ca3a447e89087ab7 bạn có thể thấy rằng nó không tách biệt hai câu lệnh với 'truy vấn' như với rollback ... – Adelin

+2

Tôi đã thử cách này và myBatis đã ném một ngoại lệ. Vấn đề là tôi đã không đặt cờ allowMultiQueries = true trong URL JDBC. Cảm ơn. –

+0

Điều này không có tác dụng đối với tôi, tôi đang cố xóa hai lô dữ liệu qua điều kiện 'in', tuy nhiên tôi gặp phải lỗi cú pháp ngữ pháp sql. –

16

Tôi đang sử dụng myBatis với Oracle. Tôi đoán có cái gì đó tương tự trong DB khác. Trên thực tế bạn luôn có thể tạo các thủ tục trong DB, thường là tốt hơn cho tương lai, khi bạn phải hỗ trợ dự án.

<delete id="deleteUnfinishedData" parameterType="map"> 
    {call 
     declare 
     begin 
      delete from TABLE1 where id = #{valueFromMap1}; 
      delete from TABLE2 where id = #{valueFromMap2}; 
     end 
    } 
</delete> 
+1

Oracle là một con thú đặc biệt ở chủ đề này. Cảm ơn bạn đã cho thấy ví dụ đó, chỉ là những gì tôi cần hôm nay. – Marc

+0

Làm việc như một sự quyến rũ. Cảm ơn! –

+0

Làm thế nào điều này có thể được sửa đổi cho SQL Server? – SMKS