Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách bỏ ràng buộc NOT NULL khỏi cột trong MySQL

Để 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 COLUMN khó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=NONE cho 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