Câu 1Khi bạn chạy INSERT INTO book (title, price) VALUES ('Nhập môn SQL', 1980);, điều gì xảy ra với cột id (INTEGER PRIMARY KEY) không có trong danh sách cột?
INSERT — Thêm dữ liệu vào bảng
Học câu lệnh SQL INSERT từ cơ bản. Bao gồm dạng cột được đặt tên, dạng rút gọn bỏ qua cột, và chèn hàng loạt nhiều hàng — ba mẫu được minh họa với các bảng riêng và chạy trực tiếp trên trình duyệt của bạn.
INSERT — thêm hàng vào bảng
Để thêm một hàng mới vào bảng, bạn dùng câu lệnh INSERT. SELECT là về "đọc dữ liệu"; INSERT là thao tác cơ bản nhất để "chèn dữ liệu." Đăng ký người dùng, ghi nhận giao dịch, ghi log — phần lớn việc "lưu một thứ gì đó" trong ứng dụng đều xảy ra qua INSERT.
Đặt tên cột và giá trị (dạng cơ bản)
Dạng phổ biến nhất đặt tên cả cột và giá trị: INSERT INTO table_name (col, col, ...) VALUES (val, val, ...);. Sau tên bảng, liệt kê các cột trong dấu ngoặc đơn, và sau VALUES, liệt kê các giá trị theo cùng thứ tự và cùng số lượng.
Ở dạng này, bất kỳ cột nào không có trong danh sách đều mặc định là NULL (hoặc DEFAULT của cột). Nếu bạn bỏ qua cột INTEGER PRIMARY KEY, đánh số tự động kích hoạt và một số nguyên chưa dùng được gán.
INSERT INTO là "chèn vào bảng nào," danh sách cột trong ngoặc đơn là "cột nào nhận giá trị," và bên trong VALUES (...) là "các giá trị, theo cùng thứ tự với danh sách cột." Hãy nắm vị trí và vai trò của từng phần.-- Thêm 1 hàng vào book (chỉ title và price)
INSERT INTO book (title, price) VALUES ('Nhập môn SQL', 1980);
-- Kiểm tra kết quả
SELECT * FROM book;
Còn các cột bị bỏ qua thì sao?
Các cột không có trong danh sách nhận DEFAULT của cột (hoặc NULL nếu không có). Đối với cột INTEGER PRIMARY KEY, đánh số tự động kích hoạt và một số nguyên chưa dùng được gán (tương đương AUTO_INCREMENT của MySQL).
Bỏ qua danh sách cột để điền tất cả các cột
Một dạng khác là cách rút gọn không có danh sách cột, liệt kê giá trị cho tất cả cột theo thứ tự: INSERT INTO table_name VALUES (val, val, ...);. Từ khóa VALUES đến ngay sau tên bảng.
Đánh đổi cho việc ngắn hơn: bạn phải nhớ thứ tự cột của bảng. Và một khi ALTER TABLE thêm cột sau này, dạng này bị hỏng vì số lượng giá trị không còn khớp — nên chỉ dùng nó cho các tình huống hạn chế như nạp dữ liệu tạm thời hoặc các script dùng một lần.
-- Thêm 1 hàng vào task (bỏ qua danh sách cột)
INSERT INTO task VALUES ('Dọn dẹp', 0);
-- Kiểm tra kết quả
SELECT * FROM task;
Dạng bỏ qua cột bị hỏng dưới ALTER TABLE
INSERT INTO task VALUES ('Dọn dẹp', 0); hoạt động hôm nay vì bảng có 2 cột. Nếu bạn sau này chạy ALTER TABLE task ADD COLUMN due_on TEXT;, mỗi cột cần một giá trị (3 cột), và INSERT này bị hỏng với lỗi không khớp số lượng giá trị.
Đối với ứng dụng và script chính thức, hãy ưu tiên dạng cột được đặt tên (dạng cơ bản) — khi định nghĩa bảng phát triển, bạn không phải viết lại các INSERT của mình. Dùng dạng rút gọn cho các trường hợp hạn chế như "dữ liệu tạm thời với schema cố định" hoặc "script dùng một lần."
Thêm nhiều hàng cùng lúc
Một câu lệnh INSERT cũng có thể thêm nhiều hàng cùng lúc. Chỉ cần liệt kê nhiều bộ `(val, val, ...)` ngăn cách bằng dấu phẩy sau VALUES — mỗi cặp dấu ngoặc là một hàng.
Có hai lý do để làm điều này. Một là ít mã hơn, và lý do kia là chỉ cần một vòng đến cơ sở dữ liệu, nhanh hơn việc chạy một INSERT cho mỗi hàng. Nạp hàng loạt từ tệp CSV hoặc log là trường hợp dùng tiêu chuẩn cho dạng này.
-- Thêm 3 hàng vào product cùng lúc
INSERT INTO product (name, price) VALUES
('Táo', 150),
('Chuối', 100),
('Cam', 200);
-- Kiểm tra kết quả
SELECT * FROM product;
Khi dạng bỏ qua cột bị vỡ — khi ALTER TABLE thêm một cột
Callout trước đó nói "dạng bỏ qua cột bị hỏng dưới ALTER TABLE." Thấy nó vỡ một lần cho bạn một tham chiếu cụ thể để quay lại khi quyết định có dùng dạng rút gọn trong production hay không.
Cho bài tập cuối cùng của bài viết, tạo một bảng tạm `task_v2`, thêm một cột với ALTER TABLE, và thử cùng INSERT bỏ qua cột trước và sau. INSERT đã hoạt động trước đó thất bại với lỗi "số lượng giá trị không khớp" ngay khi một cột được thêm.
Kiểm tra kiến thức
Hãy trả lời từng câu hỏi một.
Câu 2Câu nào sau đây mô tả đúng dạng bỏ qua cột, INSERT INTO table_name VALUES (...)?
Câu 3Câu nào sau đây là cách đúng để viết một INSERT nhiều hàng?