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

MySQL เพิ่มคอลัมน์ NOT NULL ใหม่ลงตารางที่มีข้อมูลอยู่แล้ว

การเพิ่มคอลัมน์ NOT NULL ใหม่ลงในตารางที่มีข้อมูลอยู่แล้ว จะสำเร็จก็ต่อเมื่อ ตารางว่างเปล่า หรือ ระบุ DEFAULT VALUE ไว้ มิฉะนั้นจะ Error

ตัวอย่างที่สำเร็จ (ตารางว่าง)

1. สร้างตาราง

mysql> CREATE TABLE DemoTable (
    StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    StudentName VARCHAR(20)
);
Query OK, 0 rows affected (0.60 sec)

2. เพิ่มคอลัมน์ NOT NULL (สำเร็จเพราะตารางว่าง)

mysql> ALTER TABLE DemoTable ADD COLUMN StudentAge INT NOT NULL;
Query OK, 0 rows affected (0.52 sec)

3. Insert ข้อมูล (ต้องระบุ StudentAge ทุกครั้ง)

mysql> INSERT INTO DemoTable(StudentName, StudentAge) VALUES('Chris', 21);
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(StudentName, StudentAge) VALUES('David', 23);
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO DemoTable(StudentName, StudentAge) VALUES('Mike', NULL);
ERROR 1048 (23000): Column 'StudentAge' cannot be null

4. ผลลัพธ์

mysql> SELECT * FROM DemoTable;
+-----------+-------------+------------+
| StudentId | StudentName | StudentAge |
+-----------+-------------+------------+
|         1 | Chris       |         21 |
|         2 | David       |         23 |
+-----------+-------------+------------+

กรณีตารางมีข้อมูลอยู่แล้ว (จะ Error)

ALTER TABLE existing_table ADD COLUMN new_col INT NOT NULL;
-- ERROR: Column 'new_col' cannot be null (ถ้ามีข้อมูลอยู่แล้ว)

วิธีแก้: เพิ่ม DEFAULT VALUE

-- วิธี 1: ระบุ DEFAULT ตอน ADD COLUMN
ALTER TABLE existing_table ADD COLUMN new_col INT NOT NULL DEFAULT 0;

-- วิธี 2: เพิ่มเป็น NULL ก่อน -> Update ค่า -> แล้วค่อย ALTER เป็น NOT NULL
ALTER TABLE existing_table ADD COLUMN new_col INT NULL;
UPDATE existing_table SET new_col = 0 WHERE new_col IS NULL;
ALTER TABLE existing_table MODIFY COLUMN new_col INT NOT NULL;

สรุป

  • ตารางว่าง: ADD COLUMN col TYPE NOT NULL ได้เลย
  • ตารางมีข้อมูล: ต้องมี DEFAULT value หรือทำ 3 ขั้นตอน (ADD NULL -> UPDATE -> MODIFY NOT NULL)
  • หลัง ADD NOT NULL แล้ว INSERT ต้องระบุค่าคอลัมน์นั้นทุกครั้ง