การ INSERT เฉพาะตอนตารางว่างด้วย NOT EXISTS และ Subquery
ใช้ subquery กับ NOT EXISTS เพื่อตรวจสอบว่าตารางว่างก่อนทำการ INSERT
ไวยากรณ์
INSERT INTO yourTableName(yourColumnName)
SELECT 'anyValue'
WHERE NOT EXISTS (SELECT * FROM yourTableName);
ตัวอย่างการใช้งาน
สร้างตาราง:
CREATE TABLE ExecuteInsertDemo (
Name VARCHAR(20)
);
กรณี 1: ตารางมีข้อมูลอยู่แล้ว (INSERT ไม่ทำงาน):
INSERT INTO ExecuteInsertDemo VALUES('John'); -- มีข้อมูล 1 แถว
INSERT INTO ExecuteInsertDemo(Name)
SELECT 'Larry'
WHERE NOT EXISTS (SELECT * FROM ExecuteInsertDemo);
-- Query OK, 0 rows affected (ไม่ได้ insert)
กรณี 2: ตารางว่าง (INSERT ทำงาน):
TRUNCATE TABLE ExecuteInsertDemo; -- ล้างข้อมูล
INSERT INTO ExecuteInsertDemo(Name)
SELECT 'Larry'
WHERE NOT EXISTS (SELECT * FROM ExecuteInsertDemo);
-- Query OK, 1 row affected (insert สำเร็จ)
การประยุกต์ใช้
- Initial data / Seed data - ใส่ข้อมูลเริ่มต้นตอนติดตั้งระบบ
- Singleton pattern - ตารางที่ควรมีแค่ 1 แถว (config, settings)
- Idempotent scripts - รันซ้ำได้หลายครั้งโดยไม่ duplicate
รูปแบบอื่น: INSERT IGNORE / ON DUPLICATE KEY
หากมี Primary Key หรือ Unique Key:
-- ข้ามหาก key ซ้ำ
INSERT IGNORE INTO settings (config_key, config_value) VALUES ('site_name', 'MySite');
-- หรืออัปเดตหาก key ซ้ำ
INSERT INTO settings (config_key, config_value) VALUES ('site_name', 'MySite')
ON DUPLICATE KEY UPDATE config_value = 'MySite';
ข้อจำกัด
- Subquery ใน WHERE NOT EXISTS อาจช้าบนตารางใหญ่ (ต้อง full table scan)
- สำหรับตารางใหญ่ ควรใช้ตัวแปรหรือตารางควบคุมแทน
- Race condition: ในระบบ concurrent อาจมีโอกาส insert ซ้ำ (ใช้ transaction + lock หากสำคัญ)