ใช้ PREPARE / EXECUTE ภายใน Stored Procedure สร้างตารางจากชื่อที่รับเข้ามา
ตัวอย่าง Stored Procedure
DELIMITER $$
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 $$
DELIMITER ;
เรียกใช้ Procedure
mysql> CALL creatingDynamicTableDemo('DemoTable');
ตรวจสอบโครงสร้าง
mysql> DESC DemoTable;
+-------------+------------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------------+------------------+------+-----+---------+----------------+ | StudentId | int(10) unsigned | NO | PRI | NULL | auto_increment | | StudentName | varchar(20) | NO | | NULL | | +-------------+------------------+------+-----+---------+----------------+
ข้อควรระวังด้านความปลอดภัย (SQL Injection)
- ใช้ Backtick
`ครอบชื่อตาราง/คอลัมน์:CONCAT('`', @name, '`') - Validate Input: ชื่อตารางต้อง match regex
^[a-zA-Z0-9_]+$ - หลีกเลี่ยง Dynamic SQL หากเป็นไปได้
ใช้งานจริง: Partitioning / Sharding
-- สร้างตารางรายเดือน
CALL create_monthly_table('sales_2024_01');
CALL create_monthly_table('sales_2024_02');