Để xóa ràng buộc NOT NULL cho phép cột chấp nhận giá trị NULL, bạn dùng ALTER TABLE ... MODIFY COLUMN định nghĩa lại cột không có từ khóa NOT NULL.
Cú pháp
ALTER TABLE ten_bang MODIFY COLUMN ten_cot kieu_du_lieu;
Lưu ý: Phải khai báo lại đầy đủ kiểu dữ liệu (VARCHAR(20), INT, v.v.) nhưng bỏ qua NOT NULL.
Ví dụ minh họa
1. Tạo bảng có cột NOT NULL
CREATE TABLE NotNullDemo (
Id INT NOT NULL AUTO_INCREMENT,
Name VARCHAR(20) NOT NULL,
PRIMARY KEY(Id)
);
2. Thử chèn NULL → LỖI
INSERT INTO NotNullDemo(Name) VALUES(NULL);
ERROR 1048 (23000): Column 'Name' cannot be null
3. Bỏ ràng buộc NOT NULL
ALTER TABLE NotNullDemo MODIFY COLUMN Name VARCHAR(20);
Kết quả: Query OK, 0 rows affected (1.78 sec)
4. Chèn NULL thành công
INSERT INTO NotNullDemo(Name) VALUES(NULL);
INSERT INTO NotNullDemo(Name) VALUES('Sam');
INSERT INTO NotNullDemo(Name) VALUES('Mike');
INSERT INTO NotNullDemo(Name) VALUES(NULL);
INSERT INTO NotNullDemo(Name) VALUES(NULL);
INSERT INTO NotNullDemo(Name) VALUES('John');
5. Kiểm tra dữ liệu
SELECT * FROM NotNullDemo;
Kết quả:
+----+------+
| Id | Name |
+----+------+
| 1 | NULL |
| 2 | Sam |
| 3 | Mike |
| 4 | NULL |
| 5 | NULL |
| 6 | John |
+----+------+
Kiểm tra cấu trúc sau khi thay đổi
DESC NotNullDemo;
Kết quả: Cột Null hiển thị YES cho cột Name.
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
Các trường hợp liên quan
Thêm NOT NULL (ngược lại)
ALTER TABLE ten_bang MODIFY COLUMN ten_cot kieu_du_lieu NOT NULL;
⚠️ Chỉ thành công nếu cột không có giá trị NULL nào.
Thay đổi kiểu dữ liệu + NOT NULL cùng lúc
ALTER TABLE ten_bang MODIFY COLUMN ten_cot VARCHAR(50) NOT NULL;
Xem thông tin cột chi tiết
SHOW COLUMNS FROM ten_bang LIKE 'ten_cot';
-- Hoặc
SELECT COLUMN_NAME, IS_NULLABLE, COLUMN_DEFAULT, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'ten_db' AND TABLE_NAME = 'ten_bang' AND COLUMN_NAME = 'ten_cot';
Lưu ý quan trọng
MODIFY COLUMNkhóa bảng (table lock) - có thể chậm trên bảng lớn- MySQL 8.0+ hỗ trợ
ALTER TABLE ... ALGORITHM=INPLACE, LOCK=NONEcho một số thay đổi - Kiểm tra dữ liệu hiện có trước khi thêm NOT NULL:
SELECT COUNT(*) FROM bang WHERE cot IS NULL; - Foreign key tham chiếu đến cột này có thể ảnh hưởng