MySQL में स्टोर्ड प्रोसीजर, PREPARE, EXECUTE, और डायनामिक SQL का उपयोग करके रनटाइम पर टेबल नाम निर्दिष्ट करके टेबल बनाएं।
स्टोर्ड प्रोसीजर बनाना
mysql> DELIMITER $$
mysql> CREATE PROCEDURE creatingDynamicTableDemo(yourTableName VARCHAR(200))
-> BEGIN
-> SET @name = yourTableName;
-> SET @st = CONCAT('
-> CREATE TABLE IF NOT EXISTS `', @name, '` (
-> `StudentId` INT UNSIGNED NOT NULL AUTO_INCREMENT,
-> `StudentName` VARCHAR(20) NOT NULL,
-> PRIMARY KEY (`StudentId`)
-> )
-> ');
-> PREPARE myStatement FROM @st;
-> EXECUTE myStatement;
-> DEALLOCATE PREPARE myStatement;
-> END $$
Query OK, 0 rows affected (0.16 sec)
mysql> DELIMITER ;
मुख्य तत्व:
CONCAT()- डायनामिक SQL स्ट्रिंग बनाता है- बैकटिक (`) - पहचानकर्ताओं को उद्धृत करता है (SQL इंजेक्शन/सिंटैक्स त्रुटि रोकता है)
PREPARE- स्ट्रिंग से स्टेटमेंट तैयार करता हैEXECUTE- तैयार स्टेटमेंट चलाता हैDEALLOCATE PREPARE- स्टेटमेंट हैंडल मुक्त करता है (महत्वपूर्ण!)
प्रोसीजर कॉल करके टेबल बनाना
mysql> CALL creatingDynamicTableDemo('DemoTable');
Query OK, 0 rows affected, 1 warning (0.65 sec)
बनी टेबल की संरचना देखना
mysql> DESC DemoTable;
आउटपुट
+-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+----------------+ | StudentId | int(10) unsigned | NO | PRI | NULL | auto_increment | | StudentName | varchar(20) | NO | | NULL | | +-------------+------------------+------+-----+---------+----------------+ 2 rows in set (0.00 sec)
सुरक्षा चेतावनी: डायनामिक SQL में उपयोगकर्ता इनपुट सीधे उपयोग करने से SQL इंजेक्शन का खतरा होता है। हमेशा:
- पहचानकर्ताओं को बैकटिक में लपेटें:
CONCAT('`', REPLACE(input, '`', ''), '`') - सफेद सूची (व्हाइटलिस्ट) से मान्य करें
- संभव हो तो डायनामिक DDL से बचें
उपयोग के मामले: शार्डिंग, पार्टीशनिंग, मल्टी-टेनेंट एप्लिकेशन जहां टेबल नाम रनटाइम पर तय होता है।