2009-11-23 47 views
6

Tôi biết trong hai cách sau để xóa dữ liệu từ một bảng cơ sở dữ liệuLàm cách nào để xóa khỏi cơ sở dữ liệu?

  • DELETE nó mãi mãi
  • Sử dụng một lá cờ như IsActive/isDeleted

Bây giờ vấn đề với IsActive là tôi phải theo dõi ở khắp mọi nơi trong các truy vấn SQL của tôi cho dù bản ghi có đang hoạt động hay không. Tuy nhiên, sử dụng DELETE sẽ loại bỏ dữ liệu vĩnh viễn.

Cách tốt nhất để sao lưu dữ liệu này là gì?

Giả sử tôi có nhiều bảng trong cơ sở dữ liệu, nên tôi có chức năng chung để sao lưu mọi thứ và lưu trữ nó trong bảng khác (trong XML có thể?) Hoặc có cách nào khác.

Tôi đang sử dụng MySQL nhưng tò mò về các kỹ thuật được sử dụng trong các DB khác.

+2

mọi người có thể đủ tốt để cung cấp cho bạn đoạn mã nếu bạn cho chúng tôi biết phần mềm DB nào bạn đang sử dụng :) – tloach

+0

Sử dụng MySQL. Không phải ai khác sao? : P – Abhinav

Trả lời

13

Thay thế bảng bằng chế độ xem ẩn các mục không hoạt động.

Hoặc viết trình kích hoạt trên DELETE để sao lưu hàng vào bảng lưu trữ.

0

Bạn có thể phân vùng bảng của bạn trên cột DELETED và xác định các quan điểm đó sẽ bao gồm điều kiện:

… AND deleted = 0 

này sẽ làm cho các truy vấn trên dữ liệu hoạt động cũng giống như đơn giản và hiệu quả.

+0

abhinav muốn xóa các hàng ... do đó cần phải phân vùng ngang. – reinierpost

+0

Phân vùng và sử dụng các khung nhìn (trong 'SQL Server' và' Oracle') sẽ làm cho các truy vấn hoạt động chính xác như thể các hàng đã bị xóa vật lý khỏi các bảng. Và để làm việc với dữ liệu đã xóa (hoặc tổng hợp), bạn luôn có thể viết các truy vấn đơn giản trực tiếp với các bảng. – Quassnoi

2

Bạn có thể sử dụng trình kích hoạt kích hoạt xóa hồ sơ để sao lưu chúng vào một số loại bảng nghĩa trang.

0

Vâng, nếu bạn đang sử dụng SqlServer, bạn có thể sử dụng trình kích hoạt, cho phép bạn di chuyển bản ghi sang bảng đã xóa.

+1

Máy chủ SQL không phải là cơ sở dữ liệu duy nhất có tính năng kích hoạt, nhưng nó sẽ giúp bạn biết liệu Abhinav có đang sử dụng RDBMS hỗ trợ trình kích hoạt hay không. Những người khác tôi có thể nghĩ là MySQL, Oracle, Progress OpenEdge, và có lẽ là những người khác. – ssakl

+0

Tôi có MySQL 4.1.25. Điều này sẽ làm việc ở đó? – Abhinav

+0

Nếu phiên bản đó đã kích hoạt, thì có, nó nên. Xin lỗi, tôi sử dụng Sql Server, vì vậy tôi không chắc chắn về phiên bản bạn đang sử dụng. –

2

Bạn có thể sử dụng cột isDeleted và xác định chế độ xem chọn tất cả các cột ngoại trừ isDeleted với điều kiện làDeleted = false. Sau đó, tất cả các stps của bạn chỉ làm việc với khung nhìn.

1

Bạn có thể duy trì một bảng lịch sử, nơi bạn phía sau kỷ lục lên và thời gian tem

1

Một trong những lý do lớn nhất cho không xóa dữ liệu là nó có thể được yêu cầu cho một mối quan hệ - ví dụ như người dùng có thể quyết định xóa một khách hàng cũ khỏi cơ sở dữ liệu, nhưng bạn vẫn cần bản ghi khách hàng vì nó được tham chiếu bởi các hóa đơn cũ (có thể có tuổi thọ dài hơn nhiều).

Dựa trên giải pháp này thường là loại cột "IsDeleted", kết hợp với chế độ xem (Quassnoi đã đề cập đến phân vùng, có thể trợ giúp các vấn đề hiệu suất có thể xuất hiện do nhiều dữ liệu vô hình).

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