2010-03-12 31 views
17

Có bất cứ điều gì như thế này:
TEST DELETE FROM user WHERE somekey = 45;Có lệnh nào để kiểm tra truy vấn SQL mà không thực thi nó không? (MySQL hoặc ANSI SQL)

Đó có thể trở lại bất kỳ lỗi nào, ví dụ rằng somekey không tồn tại, hoặc một số vi phạm hạn chế hoặc bất cứ điều gì, và báo cáo bao nhiêu hàng sẽ bị ảnh hưởng, nhưng không thực hiện truy vấn?
Tôi biết bạn có thể dễ dàng chuyển bất kỳ truy vấn nào trong truy vấn chọn không có tác dụng ghi hoặc xóa trong bất kỳ hàng nào, nhưng điều đó có thể dẫn đến lỗi và không thực tế nếu bạn muốn kiểm tra và gỡ lỗi nhiều truy vấn.

Trả lời

32

Điều duy nhất tôi biết là để bọc nó trong một giao dịch mà luôn cuộn lại:

BEGIN TRANSACTION 

DELETE FROM user WHERE somekey = 45; 

ROLLBACK TRANSACTION 

Hãy chắc chắn rằng bạn thực hiện toàn bộ khối và không chỉ là tuyên bố xóa. Ngoài ra, KHÔNG chạy trên bất kỳ môi trường sản xuất nào hoặc bất kỳ hệ thống nào mà bạn không thể mất dữ liệu.

+2

Tại sao bạn không nên chạy truy vấn này trong môi trường sản xuất? – franzlorenzon

+0

@franzlorenzon Tôi đoán nó chỉ là một điều hoang tưởng về phía tôi. Tôi không muốn quên BEGIN GIAO DỊCH và vô tình xóa một bản ghi. – NYSystemsAnalyst

+3

Không hoạt động trên MySQL – ub3rst4r

0

Kiến thức của tôi không tồn tại. Hơn nữa, sẽ không có lỗi nếu không có somekey với giá trị 45 không tồn tại. Nó sẽ không xóa bất cứ điều gì.

+0

Ý tôi là, ví dụ, một trường được nhập vào một truy vấn có thể không tồn tại, hoặc bị viết sai chính tả và tạo ra một lỗi SQL. – Petruza

5

ANSI SQL: No.

MySQL: Có thể. Từ khóa EXPLAIN ban đầu chỉ làm việc với SELECT, nhưng nó có thể đã được mở rộng đến UPDATE và DELETE bây giờ.

+0

GIẢI THÍCH cho tôi với các truy vấn UPDATE trong MySQL 5.6.10 – Dwayne

8

Trong MySQL sử dụng này

START TRANSACTION; 
QUERY; 

Điều quan trọng là sử dụng ";" bởi vì nếu không, nó sẽ không hoạt động. Ví dụ

START TRANSACTION; 
UPDATE tableX SET colX = valueA, colY = valueB WHERE id=1 

tham khảo ở đây http://dev.mysql.com/doc/refman/5.0/en/commit.html

0

Bạn có thể sử dụng F11 với Teradata SQL Assistant để làm điều này

0

Loại. Giả sử bạn có một bảng mà bạn muốn cập nhật: "Entry". Bạn có thể

SELECT Col1 = OTHER.Col4, 
     Col2 = EXTRA.Col2, 
FROM dbo.Entry E 
    INNER JOIN MYOTHERTABLE OTHER ON OTHER.Id = E.Id 
    INNER JOIN MYEXTRATABLE EXTRA ON EXTRA.Id = OTHER.Id 

Trong trường hợp này, Col1 và Col2 là các cột của bảng Mục nhập. Nếu bạn đã viết

UPDATE E 
SET 

thay vì SELECT ban đầu, bạn sẽ có bản cập nhật của mình. Nó không hoạt động cho tất cả các kịch bản, nhưng nếu đó là một bản cập nhật đơn giản, bạn có thể xem trước nhanh theo cách này.

Các vấn đề liên quan