Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL Stored Procedure: รัน SHOW CREATE TABLE แบบไดนามิก

สร้างตารางตัวอย่าง

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;