การอัปเดตค่า NULL ให้เป็นค่าที่กำหนดใน Stored Procedure
ใช้คำสั่ง UPDATE ร่วมกับ IS NULL ภายใน Stored Procedure เพื่อตั้งค่า Default ให้คอลัมน์ที่เป็น NULL
รูปแบบคำสั่ง
DELIMITER //
CREATE PROCEDURE procedure_name()
BEGIN
UPDATE table_name
SET column_name = 'default_value'
WHERE column_name IS NULL;
END //
DELIMITER ;
ตัวอย่าง: ตั้งค่า FirstName = 'Robert' ให้แถวที่ FirstName เป็น NULL
1. สร้างตารางและเพิ่มข้อมูล (มี NULL)
CREATE TABLE DemoTable (
Id INT,
FirstName VARCHAR(50)
);
INSERT INTO DemoTable VALUES (100, 'Chris');
INSERT INTO DemoTable VALUES (101, NULL);
INSERT INTO DemoTable VALUES (102, 'Mike');
INSERT INTO DemoTable VALUES (103, NULL);
2. ดูข้อมูลก่อน
SELECT * FROM DemoTable;
ผลลัพธ์: Id 101 และ 103 มี FirstName = NULL
3. สร้าง Stored Procedure
DELIMITER //
CREATE PROCEDURE where_clauseProc()
BEGIN
UPDATE DemoTable
SET FirstName = 'Robert'
WHERE FirstName IS NULL;
END //
DELIMITER ;
4. เรียกใช้ Procedure
CALL where_clauseProc();
ผลลัพธ์: Query OK, 2 rows affected (0.10 sec)
5. ตรวจสอบหลังรัน Procedure
SELECT * FROM DemoTable;
ผลลัพธ์:
+------+-----------+
| Id | FirstName |
+------+-----------+
| 100 | Chris |
| 101 | Robert |
| 102 | Mike |
| 103 | Robert |
+------+-----------+
การใช้ IF() หรือ CASE ใน UPDATE (ทำได้ในคำสั่งเดียว ไม่ต้อง Procedure)
UPDATE DemoTable
SET FirstName = IF(FirstName IS NULL, 'Robert', FirstName);
หรือ
UPDATE DemoTable
SET FirstName = CASE WHEN FirstName IS NULL THEN 'Robert' ELSE FirstName END;
ข้อดีของ Stored Procedure ในกรณีนี้
- Encapsulation: ซ่อน Logic ไว้ใน DB
- Reusability: เรียกใช้ซ้ำได้ด้วย
CALL - Security: ให้สิทธิ์ EXECUTE แทน UPDATE ตรงตาราง
- Transaction: ควบคุม Transaction ได้ใน Procedure
ข้อควรระวัง
IS NULLคือวิธีเดียวที่ตรวจสอบ NULL ได้ถูกต้อง (= NULLผิด)- Procedure นี้อัปเดตทุกแถวที่ NULL → อาจเยอะมาก ควรมี LIMIT หรือเงื่อนไขเพิ่ม
- MySQL Procedure ไม่รองรับ Parameter แบบ OUT/INOUT ได้เต็มที่เหมือน PostgreSQL/Oracle
การเพิ่ม Parameter ให้ Procedure
DELIMITER //
CREATE PROCEDURE update_null_names(IN new_name VARCHAR(50))
BEGIN
UPDATE DemoTable
SET FirstName = new_name
WHERE FirstName IS NULL;
END //
DELIMITER ;
CALL update_null_names('Default Name');