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

INSERT ข้อมูลก็ต่อเมื่อตารางว่างเปล่าใน MySQL

การ 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 หากสำคัญ)