2011-10-11 34 views
5

Có thể di chuyển các hàng được 3 ngày tuổi vào một bảng khác được gọi là "Table_Archive" tự động trong các tệp mysql một tuần không?Di chuyển các hàng từ TableA sang Bảng lưu trữ

tableA ví dụ:

ID | stringvalue | Timestamp 
1 | abc   | 2011-10-01 
2 | abc2  | 2011-10-02 
3 | abc3  | 2011-10-05 
4 | abc4  | 2011-10-10 
5 | abc5  | 2011-10-11 

Sau khi di chuyển

tableA:

ID | stringvalue | Timestamp 
4 | abc4  | 2011-10-10 
5 | abc5  | 2011-10-11 

Table_Archive:

ID | stringvalue | Timestamp 
1 | abc   | 2011-10-01 
2 | abc2  | 2011-10-02 
3 | abc3  | 2011-10-05 

Và khi đầu vào mới đi vào tableA nó sẽ không được bất kỳ vấn đề với ID (PK) trong di chuyển tiếp theo?

gì Ive có:

CREATE PROCEDURE clean_tables() 
BEGIN 
    BEGIN TRANSACTION; 

    DECLARE _now DATETIME; 
    SET _now := NOW(); 

    INSERT 
    INTO Table_Archive 
    SELECT * 
    FROM TableA 
    WHERE timestamp < _now - 3; 
    FOR UPDATE; 

    DELETE 
    FROM TableA 
    WHERE timestamp < _now - 3; 

    COMMIT; 
END 

Làm thế nào để thay đổi _now là ngày 3 ngày trước?

+0

Đã xảy ra sự cố với 'INSERT' và' DELETE' đơn giản, đang chạy dưới một công việc định kỳ? –

+0

Tôi không biết nếu ID của bạn sẽ can thiệp trong tương lai. Nếu tôi xóa từ TableA và sau đó thực hiện rất nhiều chèn, sẽ không được sử dụng ID một lần nữa. Và động thái tiếp theo sẽ cố gắng chèn một hàng với cùng một ID của – Linqan

+0

Sử dụng một [Trình tự] (http://www.tutorialspoint.com/mysql/mysql-using-sequences.htm) cho các ID và nó đảm bảo rằng các ID sẽ không được lặp lại. – Manoj

Trả lời

0

Bạn có thể cần phải xem xét cron jobs nếu bạn muốn tập lệnh/truy vấn đó được thực hiện tự động.

Nếu bạn đang sử dụng cpanel có một cái nhìn vào http://www.siteground.com/tutorials/cpanel/cron_jobs.htm

+0

Có, tôi nghĩ về nhiệm vụ cron, nhưng tôi tự hỏi nếu có bất cứ điều gì được xây dựng trong mysql là tốt? – Linqan

+1

Không, tôi không nghĩ rằng 'MySQL' có thể tự động thực hiện bất kỳ truy vấn nào. Nó sẽ đơn giản chạy nó khi đưa nó được chuyển tiếp. Cần phải có ai đó/chương trình/cronjob đẩy truy vấn một lần trong một tuần, trong trường hợp của bạn. –

+0

Okey, sau đó tôi sử dụng tác vụ cron .. thx – Linqan

10

Cá nhân, tôi sẽ tận dụng các MySQL Event Scheduler. Đây là một bộ lập lịch trình sự kiện được xây dựng sẵn giống như CRON trong Linux.

Bạn có thể chỉ định nó để gọi thủ tục, thủ tục hoặc chức năng hoặc chạy một chút SQL trong khoảng thời gian được chỉ định.

Đọc các tài liệu MySQL nhưng một ví dụ sẽ là:

CREATE EVENT mydatabase.myevent 
ON SCHEDULE EVERY 1 WEEK STARTS CURRENT_TIMESTAMP + INTERVAL 10 MINUTE 
DO 
call clean_tables(); 

Vì vậy, đây là nói "clean_tables gọi() một lần một tuần và thực hiện cuộc gọi đầu tiên trong 10 phút thời gian"

Một Gotcha là trình lên lịch sự kiện (theo tôi nghĩ) bị tắt theo mặc định. Để bật tính năng này chạy:

SET GLOBAL event_scheduler = ON; 

Sau đó bạn có thể chạy:

SHOW PROCESSLIST; 

Để xem các chủ đề sự kiện lịch trình đang chạy.

Để giữ cột ID bảng A (nếu bạn phải). Tôi sẽ giữ ID trên Table_Archive là duy nhất cho bảng đó, nghĩa là đặt khóa chính là & auto_increment và sau đó có cột 'Original_TableA_ID' để lưu trữ ID TableA. Bạn có thể đặt một chỉ mục duy nhất về điều này nếu bạn muốn.

Vì vậy Table_Archive sẽ như thế nào:

create table `Table_Archive` (
ID int unsigned primary key auto_increment, -- < primary key auto increment 
tableAId unsigned int not null, -- < id column from TableA 
stringValue varchar(100), 
timestamp datetime, 
UNIQUE KEY `archiveUidx1` (`tableAId`) -- < maintain uniqueness of TableA.ID column in Archive table 
); 

Không ai dường như đã trả lời câu hỏi ban đầu của bạn "Làm thế nào để thay đổi _now là ngày 3 ngày trước?".Bạn làm điều đó bằng INTERVAL:

DELIMITER $ 

CREATE PROCEDURE clean_tables() 
BEGIN 
BEGIN TRANSACTION; 

DECLARE _now DATETIME; 
SET _now := NOW(); 

INSERT 
INTO Table_Archive 
SELECT * 
FROM TableA 
WHERE timestamp < _now - interval 3 day; 
FOR UPDATE; 

DELETE 
FROM TableA 
WHERE timestamp < _now - interval 3 day; 

COMMIT; 
END$ 

DELIMITER ; 

Một điểm cuối cùng là bạn nên xem xét việc tạo một chỉ mục trên cột timestamp trên TableA để cải thiện hiệu suất của bạn clean_tables() thủ tục.

0

Thêm vào câu trả lời hay nhất (IMO) của Tom Mac về trình lên lịch sự kiện - lưu ý rằng khi sao lưu giản đồ, bạn phải chỉ định rằng bạn muốn các sự kiện được sao lưu bằng cờ --events = TRUE .

Nếu bạn đang xuất thủ công trong bàn làm việc, phiên bản mới nhất có hộp kiểm trên tab 'Xuất sang đĩa' chính - phiên bản cũ ẩn nó trong tab Tùy chọn xuất nâng cao.

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