2012-04-13 40 views

Trả lời

17

Nếu bạn có quyền kiểm soát lược đồ của mình, tôi sẽ làm cho lược đồ sử dụng cascading deletes.

Từ bài viết (phần thích hợp hơn dịch ví dụ của bạn)

CREATE TABLE point 
(
    pt_id integer PRIMARY KEY, 
    evt_id integer REFERENCES event ON DELETE CASCADE 
) 

Nếu bạn có thác thiết lập, sau đó bạn có thể chỉ cần xóa từ bảng sự kiện chính và tất cả các bảng khác sẽ được dọn dẹp tự động

Nếu không, bạn cần xóa tất cả các tham chiếu trước, sau đó bạn xóa bảng chính. Bạn nên làm điều này trong một giao dịch để giữ cho dữ liệu nhất quán

BEGIN; 
DELETE FROM trace WHERE EXISTS 
    (SELECT 1 FROM point WHERE evt_id = 1139 AND trace.pt_id = point.pt_id); 
DELETE FROM point where evt_id = 1139; 
DELETE FROM magnitude where evt_id = 1139; 
DELETE FROM event where evt_id = 1139; 
COMMIT; 
-3
$delete = 1139; 
$query = "DELETE FROM event, magnitude, point WHERE evt_id = '$delete'"; 
mysql_query($query, $con); 
$query = "DELETE FROM trace WHERE pt_id = '$delete'"; 

hoặc chỉ cần dán tuyên bố rằng vào một file sql và chạy nó, hoặc vào cửa sổ truy vấn phần mềm sql của bạn, hoặc đặt nó trong một .php và chạy trên máy chủ.

+1

Theo như tôi biết, bạn không thể xóa khỏi nhiều bảng như thế (nhưng tôi có thể sai). Tuy nhiên, tối thiểu 'dấu vết' không có một cột evt_id –

+0

Cơ sở dữ liệu nằm trên máy chủ. Làm cách nào để chạy tệp truy vấn này? – user1202766

+0

Có thats dấu vết đúng không có một cột evt_id nhưng có pt_id đó là từ bảng điểm có evt_id cột .. đó là khó hiểu! – user1202766

-1

Tôi giả định rằng id trong các bảng khác nhau tương ứng và được sử dụng để liên kết. Tôi cũng giả sử bạn muốn xóa tất cả các điểm dấu vết allthough họ chỉ gián tiếp liên quan đến evt_id

Bạn có thể xóa các bản ghi của bạn từ tất cả các bảng như sau:

DELETE event , magnitude, trace, point 
FROM event left join magnitude on event.evt_id = magnitude.evt_id 
    left join point on event.evt_id = point.evt_id 
     left join trace on point.pt_id = trace.trace_id 
where event_id=1139 
+5

Điều này sẽ chỉ làm việc trong mysql, và OP đã gắn thẻ lại câu hỏi này từ mysql và postgresql để chỉ postgresql –

7

Yếu tố không tầm thường chỉ trong câu hỏi của bạn là xóa từ bảng trace. Tôi đoán có an toàn khi giả sử trace.pt_id đang tham chiếu point.pt_id?

Hoặc bạn xác định foreign key with ON DELETE CASCADE và chỉ cần quên bảng trace (như đã là pointed out by @kevin) hoặc bạn phải quản lý các hàng tùy chỉnh theo cách thủ công.

Kể từ PostgreSQL 9.1 bạn có thể sử dụng data-modifying CTEs:

BEGIN; 

WITH x AS (
    DELETE FROM point WHERE evt_id = 1139 
    RETURNING pt_id 
    ) 
DELETE FROM trace 
USING x 
WHERE trace.pt_id = x.pt_id; 

DELETE FROM magnitude WHERE evt_id = 1139; 

DELETE FROM event WHERE evt_id = 1139; 

COMMIT; 

Các RETURNING clause của DELETE FROM point trả về tất cả ảnh hưởng pt_id - những người đang lần lượt sử dụng để xóa tất cả các hàng tương ứng từ trace.

Bạn không đề cập đến việc đồng thời có phải là vấn đề trong trường hợp của bạn hay không. Nếu có, và nếu bạn muốn tránh các kết quả có thể xảy ra trong khoảng thời gian ngắn giữa các lần xóa nơi các hàng cho evt_id = 1139 có mặt trong một bảng trong khi đã bị xóa khỏi bảng khác, hãy bọc tất cả thành giao dịch .
Nếu điều đó không quan tâm đến bạn, hãy bỏ qua BEGINCOMMIT.

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