MySQL में INSERT INTO ... SELECT स्टेटमेंट का उपयोग करके एक टेबल से डेटा चुनकर दूसरी टेबल में डाल सकते हैं। यह डेटा माइग्रेशन, आर्काइविंग, रिपोर्टिंग टेबल भरने, और ETL प्रक्रियाओं के लिए मूलभूत तकनीक है।
सिंटैक्स
INSERT INTO target_table (col1, col2, col3) SELECT col1, col2, col3 FROM source_table WHERE condition;
व्यावहारिक उदाहरण
स्रोत टेबल बनाएं:
mysql> CREATE TABLE DemoTable1 (
Id INT,
Name VARCHAR(20),
Age INT
);
डेटा डालें:
mysql> INSERT INTO DemoTable1 VALUES(100, 'Chris', 24); mysql> INSERT INTO DemoTable1 VALUES(101, 'Adam', 23); mysql> INSERT INTO DemoTable1 VALUES(102, 'John', 25); mysql> INSERT INTO DemoTable1 VALUES(103, 'Carol', 26);
लक्ष्य टेबल बनाएं (अलग कॉलम नाम):
mysql> CREATE TABLE DemoTable2 (
EmployeeId INT,
EmployeeFirstName VARCHAR(20),
EmployeeAge INT
);
शर्त के साथ डेटा कॉपी करें (Id = 101)
mysql> INSERT INTO DemoTable2(EmployeeId, EmployeeFirstName, EmployeeAge)
-> SELECT Id, Name, Age FROM DemoTable1 WHERE Id = 101;
Query OK, 1 row affected (0.17 sec) Records: 1 Duplicates: 0 Warnings: 0
लक्ष्य टेबल जांचें:
mysql> SELECT * FROM DemoTable2;
+------------+-------------------+-------------+ | EmployeeId | EmployeeFirstName | EmployeeAge | +------------+-------------------+-------------+ | 101 | Adam | 23 | +------------+-------------------+-------------+
मुख्य बिंदु
- कॉलम क्रम मेल खाना चाहिए:
INSERTकॉलम सूची औरSELECTकॉलम सूची क्रम और संख्या में मेल खानी चाहिए - डेटा प्रकार संगत होने चाहिए (अंतर्निहित रूपांतरण होता है)
- WHERE क्लॉज वैकल्पिक - छोड़ने पर सभी पंक्तियां कॉपी होती हैं
- ऑटो-इंक्रीमेंट: लक्ष्य टेबल में ऑटो-इंक्रीमेंट कॉलम है तो उसे
INSERTसूची से बाहर रखें
सभी पंक्तियां कॉपी करें
INSERT INTO DemoTable2(EmployeeId, EmployeeFirstName, EmployeeAge) SELECT Id, Name, Age FROM DemoTable1;
कॉलम नाम समान हों तो
INSERT INTO DemoTable2 SELECT * FROM DemoTable1;
व्यंजक/गणना के साथ चयन
INSERT INTO summary_table (category, total_sales, avg_price) SELECT category, SUM(amount), AVG(price) FROM sales GROUP BY category;
एकाधिक टेबल से डेटा (JOIN)
INSERT INTO employee_details (emp_id, emp_name, dept_name) SELECT e.id, e.name, d.name FROM employees e JOIN departments d ON e.dept_id = d.id;
प्रदर्शन युक्तियाँ
- बड़े डेटासेट के लिए
INSERT ... SELECTएकल ट्रांजैक्शन में चलता है - लॉग आकार बढ़ सकता है - बैच में विभाजित करें:
WHERE id BETWEEN ... AND ... - लक्ष्य टेबल पर इंडेक्स अस्थायी रूप से अक्षम करें:
ALTER TABLE target DISABLE KEYS(MyISAM) या बाद में पुनर्निर्माण REPLACE INTO ... SELECTयाINSERT ... ON DUPLICATE KEY UPDATEअपसर्ट के लिए
सावधानी
INSERT INTO ... SELECT स्रोत टेबल पर **शेयर्ड लॉक** ले सकता है (इंजन/आइसोलेशन लेवल पर निर्भर)। उच्च-समवर्ती प्रणालियों में ध्यान दें।
यह स्टेटमेंट MySQL में डेटा परिवर्तन और टेबल-टू-टेबल कॉपी का मुख्य उपकरण है।