Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

यदि मेरे पास एकाधिक कॉलम मानों के साथ एक MySQL तालिका है, तो मैं सबसे हालिया प्रविष्टियों में से दो को छोड़कर सभी को कैसे हटा सकता हूं?

यह आपकी समस्या का समाधान हो सकता है।

हालांकि, चूंकि कोई दिनांक-समय कॉलम नहीं है, इसलिए मैं मान रहा हूं कि आईडी कॉलम प्राथमिक कुंजी है। और यह है Auto_increment . तो मेरी धारणा यह है कि संख्या जितनी बड़ी होगी रिकॉर्ड उतना ही नया होगा। (यह तब तक सही होना चाहिए जब तक कि आपके पास टेबल में कुछ पुराना डेटा डंप न हो)

सुनिश्चित करें कि आप हटाने से पहले अपने डेटा का बैकअप लें क्योंकि इससे आपका स्थायी डेटा खो जाएगा। इससे भी बेहतर, आप वर्तमान तालिका की एक अलग तालिका में एक प्रति बना सकते हैं और यह सुनिश्चित करने के लिए नई तालिका पर काम कर सकते हैं कि नीचे दिया गया तर्क सही है। फिर tbl_new . से पढ़ने के लिए नीचे दिए गए प्रश्नों को बदलें इसके बजाय tbl . पर

आप अपनी तालिका को कुछ इस तरह से डुप्लिकेट कर सकते हैं

CREATE TABLE tbl_new LIKE tbl;

मैंने प्रत्येक प्रश्न के लिए टिप्पणियाँ छोड़ दी हैं

DROP TEMPORARY TABLE IF EXISTS keepers1, keepers2, keepers_all;
-- get the #1 top records
CREATE TEMPORARY TABLE keepers1 (KEY(id)) ENGINE=MEMORY AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;

-- get the #2 top records
CREATE TEMPORARY TABLE keepers2 AS
SELECT fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c, MAX(id) AS id
FROM tbl AS k
WHERE NOT EXISTS (SELECT 1 FROM keepers1 WHERE id = k.id)
GROUP BY fid, bid, dec_a, varc_a, varc_b, dec_b, varc_c;


-- create a temp table where you have all he ids that you want to keep
CREATE TEMPORARY TABLE keepers_all (KEY(id)) ENGINE=MEMORY AS
SELECT id FROM keepers1
UNION ALL
SELECT id FROM keepers2;


-- delete all records that you don't want to keep
DELETE k.* FROM tbl AS k WHERE NOT EXISTS (SELECT 1 FROM keepers_all WHERE id = k.id);

यदि यह एक बार की सफाई का काम है तो आपको कंसोल से प्रश्नों को निष्पादित करने में सक्षम होना चाहिए। लेकिन अगर आप उन्हें भर्ती करने वाली नौकरी की तलाश में हैं तो आपको शायद यह कोड लेना चाहिए और इसे एक प्रक्रिया में रखना चाहिए।

नोट:यहां मैं बेहतर प्रदर्शन के लिए मेमोरी टेम्पोररी टेबल का उपयोग कर रहा हूं। आप एक समस्या का सामना कर सकते हैं जो कहती है कि "तालिका भर चुकी है" ऐसा इसलिए है क्योंकि आपके पास बहुत अधिक रिकॉर्ड हैं। तो आप सत्र के लिए max_heap_table_size मान बढ़ा सकते हैं जैसे

SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G
SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; -- this will set it to 2G

यह आपको आपका वर्तमान मूल्य देगा

SELECT VARIABLES LIKE 'max_heap_table_size';
SELECT VARIABLES LIKE 'tmp_table_size';


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. लारवेल माइग्रेशन (गलती:150 विदेशी कुंजी बाधा गलत तरीके से बनाई गई है)

  2. SQLSTATE [HY000] [1045] 000webhost का उपयोग कर डेटाबेस से कनेक्ट करते समय अपवाद

  3. PDO::rowCount बनाम COUNT(*)

  4. मैं डुप्लिकेट नाम इनपुट को रोकने के लिए प्रतीत नहीं कर सकता

  5. शर्त का उपयोग करके क्वेरी का चयन करें