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

ตรวจสอบว่าตารางมีอยู่หรือไม่ด้วย CASE WHEN และ INFORMATION_SCHEMA ใน MySQL


สถานการณ์

ต้องการตรวจสอบว่าตารางชื่อหนึ่งมีอยู่ใน Database ปัจจุบันหรือไม่ และต้องการผลลัพธ์เป็น Boolean (Yes/No) ใน Query เดียว

วิธีแก้: Query INFORMATION_SCHEMA.TABLES

INFORMATION_SCHEMA.TABLES เก็บข้อมูลเมตาของตารางทั้งหมด สามารถ Query ได้เหมือนตารางทั่วไป

ตัวอย่างการใช้งาน

1. สร้างตารางทดสอบ

mysql> CREATE TABLE DemoTable (
    -> Id INT,
    -> Name VARCHAR(20)
    -> );
Query OK, 0 rows affected (1.57 sec)

2. เพิ่มข้อมูล

mysql> INSERT INTO DemoTable VALUES(101, 'Chris');
Query OK, 1 row affected (0.71 sec)
mysql> INSERT INTO DemoTable VALUES(102, 'David');
Query OK, 1 row affected (0.20 sec)

3. ตรวจสอบว่าตาราง DemoTable มีอยู่หรือไม่

mysql> SELECT MAX(CASE WHEN table_name = 'DemoTable' 
    -> THEN 'Yes the table exist(TRUE)' 
    -> ELSE 'No(FALSE)' END) AS isTableExists
    -> FROM information_schema.tables;

ผลลัพธ์:

+-------------------------------+
| isTableExists                 |
+-------------------------------+
| Yes the table exist(TRUE)     |
+-------------------------------+
1 row in set (0.52 sec)

อธิบาย Logic

  1. Query information_schema.tables ได้รายการตารางทั้งหมด
  2. CASE WHEN table_name = 'DemoTable' THEN 'Yes...' ELSE 'No...' END → แต่ละแถวคืน Yes หรือ No
  3. MAX() รวมเป็น 1 แถว: 'Yes...' > 'No...' (String comparison) → ได้ Yes หากมีตาราง

วิธีอื่นๆ ที่ง่ายกว่า

1. ใช้ COUNT() (แนะนำ)

SELECT COUNT(*) > 0 AS TableExists
FROM information_schema.tables
WHERE table_schema = DATABASE() AND table_name = 'DemoTable';

2. ใช้ EXISTS (มีประสิทธิภาพดีกว่า)

SELECT EXISTS(
    SELECT 1 FROM information_schema.tables
    WHERE table_schema = DATABASE() AND table_name = 'DemoTable'
) AS TableExists;

3. ใช้ SHOW TABLES (Client-side)

SHOW TABLES LIKE 'DemoTable';

คอลัมน์สำคัญใน INFORMATION_SCHEMA.TABLES

Column คำอธิบาย
TABLE_SCHEMA Database Name
TABLE_NAME Table Name
TABLE_TYPE BASE TABLE / VIEW / SYSTEM VIEW
ENGINE Storage Engine (InnoDB, MyISAM, etc.)
TABLE_ROWS ประมาณจำนวนแถว (InnoDB ไม่แม่นยำ 100%)
CREATE_TIME เวลาสร้าง
UPDATE_TIME เวลาอัปเดตล่าสุด

กรณีการใช้งานจริง

  • Migration Script: ตรวจสอบก่อน Create/Drop Table
  • Dynamic SQL: สร้าง Query เหมาะกับ Schema ที่มีอยู่
  • Health Check: ตรวจสอบ Table สำคัญครบครัน
  • Multi-tenant: ตรวจสอบ Table ของ Tenant แต่ละราย