Giới thiệu
MySQL cho phép INSERT INTO table VALUES (...) bỏ qua danh sách cột, miễn là cung cấp giá trị cho tất cả cột theo đúng thứ tự định nghĩa bảng. Cột AUTO_INCREMENT có thể truyền NULL hoặc DEFAULT.
Ví dụ thực hành
1. Tạo bảng DemoTable862 (Id AUTO_INCREMENT NOT NULL)
mysql> CREATE TABLE DemoTable862 (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
FirstName VARCHAR(100),
Age INT
);
2. Chèn 5 hàng không liệt kê cột, truyền NULL cho Id
mysql> INSERT INTO DemoTable862 VALUES
(NULL,'Chris',23),(NULL,'Robert',21),(NULL,'Mike',24),(NULL,'Sam',25),(NULL,'Bob',26);
3. Kết quả: Id tự động gán 1..5
+----+-----------+------+
| Id | FirstName | Age |
+----+-----------+------+
| 1 | Chris | 23 |
| 2 | Robert | 21 |
| 3 | Mike | 24 |
| 4 | Sam | 25 |
| 5 | Bob | 26 |
+----+-----------+------+
Quy tắc và lưu ý
| Điều kiện | Kết quả |
|---|---|
| Số giá trị ≠ số cột | Lỗi: Column count doesn't match value count |
| Cột NOT NULL không có DEFAULT, truyền NULL | Lỗi (trừ AUTO_INCREMENT) |
| Cột AUTO_INCREMENT truyền NULL/0/DEFAULT | Tự động gán giá trị tiếp theo |
| Thay đổi thứ tự cột (ALTER TABLE ADD COLUMN FIRST) | INSERT VALUES sẽ sai cột → dữ liệu sai/lỗi |
Khuyến nghị: LUÔN liệt kê cột
-- Tốt (an toàn, rõ ràng, bảo vệ khi schema thay đổi)
INSERT INTO DemoTable862 (FirstName, Age) VALUES ('Chris', 23);
-- Tránh (rủi ro)
INSERT INTO DemoTable862 VALUES (NULL, 'Chris', 23);
- Code bảo trì dễ dàng hơn.
- Không bị phá vỡ khi thêm cột mới (với DEFAULT) hoặc đổi thứ tự cột.
- Rõ ràng ý đồ: cột nào nhận giá trị gì.
INSERT ... SET (MySQL extension)
INSERT INTO DemoTable862 SET FirstName = 'Chris', Age = 23;
Cú pháp này cũng không cần liệt kê tất cả cột, tự động dùng DEFAULT cho cột còn lại.