สร้างตารางตัวอย่าง
mysql> create table DemoTable2011 (
StudentId int NOT NULL AUTO_INCREMENT,
StudentName varchar(20),
StudentAge int,
StudentCountryName varchar(20),
PRIMARY KEY(StudentId)
);
สร้าง Stored Procedure รัน SHOW CREATE TABLE
ใช้ Dynamic SQL (PREPARE/EXECUTE) เพราะ SHOW CREATE TABLE ไม่รับ Identifier เป็น Parameter โดยตรง:
mysql> delimiter //
mysql> create procedure test_show_create_demo(table_name varchar(100))
begin
set @query = concat("SHOW CREATE TABLE ", table_name);
prepare st from @query;
execute st;
end //
mysql> delimiter ;
เรียกใช้ Procedure
mysql> call test_show_create_demo('DemoTable2011');
ผลลัพธ์
+---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | Table | Create Table | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | DemoTable2011 | CREATE TABLE `demotable2011` ( `StudentId` int(11) NOT NULL AUTO_INCREMENT, `StudentName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, `StudentAge` int(11) DEFAULT NULL, `StudentCountryName` varchar(20) COLLATE utf8_unicode_ci DEFAULT NULL, PRIMARY KEY (`StudentId`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
ประโยชน์ของการทำแบบนี้
- ดู Schema ของตารางได้โดยไม่ต้องพิมพ์ชื่อตารางทุกครั้ง
- นำไปใช้ใน Automation, Migration Tool, หรือ Documentation Generator
- รวมกับ
INFORMATION_SCHEMAได้เพื่อดู Metadata ครบถ้วน
Query ทางเลือกจาก INFORMATION_SCHEMA
-- ดูโครงสร้างคอลัมน์ SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_KEY, EXTRA FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'DemoTable2011'; -- ดู Indexes SELECT INDEX_NAME, COLUMN_NAME, NON_UNIQUE, SEQ_IN_INDEX FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'DemoTable2011';
ข้อควรระวัง: SQL Injection
CONCAT("SHOW CREATE TABLE ", table_name) อาจถูก Inject หาก table_name มาจาก User Input
-- ป้องกัน: Validate Table Name ก่อน
IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = table_name) THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid table name';
END IF;