2011-10-11 11 views
5

क्या पंक्तियों को 3 दिनों पुराना है, जिसे "टेबल_आर्किव" नामक दूसरी तालिका में स्वचालित रूप से mysql में एक सप्ताह में जाना संभव है?टेबलए से टेबल-आर्काइव में पंक्तियों को ले जाएं

TableA पूर्व:

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 

कदम

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 

और जब नया इनपुट टेबल में आता है तो अगले कदम में आईडी (पीके) के साथ कोई समस्या नहीं होगी?

क्या Ive मिला:

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 

मैं कैसे बदल सकता हूँ _now तारीख 3 दिन पहले हो के लिए?

+0

क्रॉन नौकरी के तहत चल रहे एक साधारण 'INSERT' और 'DELETE' के साथ कुछ गड़बड़ है? –

+0

मुझे नहीं पता कि आईडी भविष्य में हस्तक्षेप करेगी या नहीं। अगर मैं टेबल ए से हटा देता हूं और फिर आवेषण के बहुत सारे बनाता है, तो आईडी फिर से उपयोग नहीं की जाएगी। और अगला कदम आईडी के लिए एक ही आईडी के – Linqan

+0

के साथ एक पंक्ति डालने का प्रयास करेगा [अनुक्रम] (http://www.tutorialspoint.com/mysql/mysql-using-sequences.htm) आईडी के लिए और यह सुनिश्चित करता है कि आईडी दोहराना नहीं है। – Manoj

उत्तर

0

यदि आप उस स्क्रिप्ट/क्वेरी को स्वचालित रूप से निष्पादित करना चाहते हैं तो आपको cron jobs पर एक बार देखने की आवश्यकता हो सकती है।

आप cpanel उपयोग कर रहे हैं मैं MySQL Event Scheduler का इस्तेमाल करते हैं होता है, निजी तौर पर http://www.siteground.com/tutorials/cpanel/cron_jobs.htm

+0

हां, मैंने क्रॉन कार्य के बारे में सोचा, लेकिन मुझे आश्चर्य है कि अगर mysql में कुछ भी बनाया गया है? – Linqan

+1

नहीं, मुझे नहीं लगता कि 'MySQL' किसी भी क्वेरी के निष्पादन को स्वचालित कर सकता है। जब इसे आगे बढ़ाया जाता है तो यह इसे चलाएगा। किसी ऐसे व्यक्ति/कार्यक्रम/क्रोनबॉज होने की आवश्यकता है जो आपके मामले में सप्ताह में एक बार क्वेरी को धक्का दे। –

+0

ठीक है, तो मैं क्रॉन कार्य का उपयोग करता हूं .. thx – Linqan

10

में एक नजर है। यह लिनक्स में सीआरओएन की तरह इवेंट शेड्यूलर में बनाया गया है।

आप इसे किसी प्रक्रिया, प्रक्रियाओं या कार्यों को कॉल करने या निर्दिष्ट अंतराल पर SQL का थोड़ा सा चलाने के लिए निर्दिष्ट कर सकते हैं।

MySQL डॉक्स पढ़ें लेकिन एक उदाहरण होगा:

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

तो यह कह रहा है "कॉल clean_tables() सप्ताह में एक बार और 10 मिनट के समय में पहले फोन करना"

एक पकड़ लिया यह है कि ईवेंट शेड्यूलर (मुझे लगता है) डिफ़ॉल्ट रूप से अक्षम है। रन पर इसे चालू करने के लिए:

SET GLOBAL event_scheduler = ON; 

फिर आप चला सकते हैं:

SHOW PROCESSLIST; 

घटना अनुसूचक धागा चल रहा है या नहीं।

आपकी तालिका ए आईडी कॉलम (यदि आपको जरूरी है) को संरक्षित करने के लिए। मैं उस तालिका के लिए तालिका के रूप में table_Archive पर आईडी रखूंगा, मैं इसे प्राथमिक कुंजी & auto_increment बना देता हूं और उसके बाद तालिका 'आईडी को संग्रहीत करने के लिए' Original_TableA_ID 'कॉलम होता है। यदि आप चाहें तो आप इस पर एक अद्वितीय इंडेक्स डाल सकते हैं।

तो Table_Archive होगा जैसे:

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 
); 

कोई भी अपने मूल प्रश्न का उत्तर दिया है लगता है "मैं कैसे बदल सकता हूँ _now तारीख होने के लिए 3 दिन पहले?"।आपको लगता है कि 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 ; 

एक अंतिम बात यह है कि आप TableA पर टाइमस्टैम्प स्तंभ पर एक सूचकांक() प्रक्रिया बनाने आप clean_tables के प्रदर्शन में सुधार करने के लिए विचार करना चाहिए है।

0

घटना शेड्यूलर के बारे में टॉम मैक द्वारा सर्वोत्तम उत्तर (आईएमओ) में जोड़ना - जागरूक रहें कि स्कीमा का बैक अप लेने पर, आपको यह निर्दिष्ट करना होगा कि आप ईवेंट को --events = TRUE ध्वज के माध्यम से इसके साथ बैक अप लेना चाहते हैं ।

यदि आप वर्कबेंच में मैन्युअल रूप से निर्यात कर रहे हैं, तो नवीनतम संस्करण में मुख्य 'निर्यात करने के लिए डिस्क' टैब पर एक चेकबॉक्स होता है - पुराने संस्करण इसे उन्नत निर्यात विकल्प टैब में छिपाते हैं।

0

यह संभव है, MySQL MySQL इवेंट शेड्यूलर का उपयोग करके विशिष्ट समय पर स्वचालित रूप से क्वेरी निष्पादित करेगा। अधिक जानकारी के लिए इस लिंक को देखें। https://dev.mysql.com/doc/refman/5.7/en/event-scheduler.html

संबंधित मुद्दे