किसी भी कारण से, phpMyAdmin मुझे प्रारंभ लेनदेन के साथ एक ईवेंट बनाने की अनुमति नहीं देगा। मैं यही उपयोग कर रहा हूं:

CREATE EVENT `set_history`
ON SCHEDULE
    EVERY 1 DAY STARTS '2018-9-29 00:00:00'
ON COMPLETION PRESERVE
DISABLE ON SLAVE
DO BEGIN

 START TRANSACTION;


INSERT INTO historical_transactions SELECT * FROM transactions WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

DELETE FROM `transactions` WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

UPDATE `accounts` SET `renew_at`= DATE_ADD(DATE(NOW()), INTERVAL 1 MONTH) WHERE `renew_at` = DATE(NOW());

COMMIT;
END

ईवेंट के बाहर चलने पर START TRANSACTION, INSERT, DELETE, UPDATE, और COMMIT सभी काम करते हैं। यह वह त्रुटि है जो मुझे मिलती रहती है:

#1064 - आपके SQL सिंटैक्स में त्रुटि है; लाइन 8 पर '' के पास'' का उपयोग करने के लिए सही सिंटैक्स के लिए अपने MySQL सर्वर संस्करण से संबंधित मैनुअल की जाँच करें

उम्मीद है कि आप मदद कर सकते हैं। धन्यवाद।

1
Todd G 29 सितंबर 2018, 21:12

1 उत्तर

सबसे बढ़िया उत्तर

आपको DELIMITER को (;) के अलावा किसी और चीज़ (जैसे: $$) के लिए परिभाषित करना होगा और अंत में इसे वापस (;) पर फिर से परिभाषित करना होगा।

मूल रूप से, PHPMyAdmin पार्सर ; को एक निष्पादन ट्रिगर के रूप में व्याख्यायित करेगा, और यह क्वेरी को ट्रिगर करने का प्रयास करेगा, बजाय इसके कि इसे पूरे ईवेंट के लिए Create स्टेटमेंट के रूप में लिया जाए। इसलिए सीमांकक को फिर से परिभाषित करने से निष्पादन को दरकिनार करने में मदद मिलती है।

निम्न कार्य करें:

DELIMITER $$
CREATE EVENT `set_history`
ON SCHEDULE
    EVERY 1 DAY STARTS '2018-9-29 00:00:00'
ON COMPLETION PRESERVE
DISABLE ON SLAVE
DO BEGIN

 START TRANSACTION;


INSERT INTO historical_transactions SELECT * FROM transactions WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

DELETE FROM `transactions` WHERE domain IN (SELECT domain FROM domain JOIN accounts ON domain.accessAbility_ID = accounts.accessAbility_ID WHERE accounts.`renew_at` = DATE(NOW()));

UPDATE `accounts` SET `renew_at`= DATE_ADD(DATE(NOW()), INTERVAL 1 MONTH) WHERE `renew_at` = DATE(NOW());

COMMIT;
END $$
DELIMITER ;
0
Madhur Bhaiya 29 सितंबर 2018, 21:26