Học bằng cách đọc theo thứ 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.

Các thành phần cú pháp của câu lệnh INSERT
INSERT INTO table(danh sách cột)VALUES (giá trị);Bảng đíchCột cần điền(tùy chọn)Danh sách giá trị(theo thứ tự cột)
Một câu lệnh INSERT ghép ba khối: 'INSERT INTO table_name', '(danh sách cột)', và 'VALUES (danh sách giá trị);'. Danh sách cột là tùy chọn — khi bị bỏ qua, các giá trị phải bao gồm mọi cột, theo thứ tự được định nghĩa.

Đặ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.

Cấu trúc của INSERT (dạng cơ bản)
INSERT INTO(danh sách cột)VALUES (giá trị)Tên bảngbookCột cần điền(title, price)Danh sách giá trị('Nhập môn SQL', 1980)Bảng đíchChọn cộtLiệt kê giá trị
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).

Hãy hình dung đăng ký một cuốn sách mới trong cơ sở dữ liệu sách. (Chạy đúng thì phần giải thích sẽ hiện ra.)

① Chèn 1 hàng vào bảng book.

② Chỉ định hai cột, titleprice. Giá trị là title='SQL thực hành'price=2480.

③ Cuối cùng, chạy SELECT * FROM book; và xác nhận id đã được đánh số tự động và published_onNULL.

SQL Editor

Chạy truy vấn để xem kết quả

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.

Dạng cột được đặt tên vs. dạng bỏ qua cột
Chỉ ghi điều cần / mạnh trước thêm cộtMọi cột theo thứ tự / vỡ khi thêm cộtDạng cột được đặt tên(khuyến nghị)INSERT INTO task (title, done) VALUES ('Dọn dẹp', 0);Dạng bỏ qua cột(rút gọn)INSERT INTO task VALUES ('Dọn dẹp', 0);
Dạng đặt tên chỉ ghi rõ các cột bạn đang điền; dạng bỏ qua liệt kê mọi cột theo thứ tự. Phiên bản ngắn hơn dễ vỡ khi cột được thêm vào sau này.
-- 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."

Hãy hình dung đăng ký một tác vụ mới trong ứng dụng todo.

① Chèn 1 hàng vào bảng task với danh sách cột bị bỏ qua.

② Thứ tự cột của tasktitledone. Dùng title='Đi chợ'done=0, theo thứ tự đó.

③ Cuối cùng, chạy SELECT * FROM task; và xác nhận hàng đã được đăng ký.

SQL Editor

Chạy truy vấn để xem kết quả

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;
INSERT nhiều hàng — mỗi () trong VALUES là một hàng
idnameprice() trong VALUES1(tự động)Táo150('Táo', 150)2(tự động)Chuối100('Chuối', 100)3(tự động)Cam200('Cam', 200)Hàng 1Hàng 2Hàng 3
Một () sau VALUES thêm một hàng; N () ngăn cách bằng dấu phẩy thêm N hàng. Bên trong mỗi (), giá trị tuân theo cùng thứ tự với danh sách cột.

Hãy hình dung khởi tạo một trang thương mại điện tử với ba sản phẩm ban đầu.

① Chèn 3 hàng cùng lúc vào bảng product.

② Chỉ định hai cột, nameprice. Ba hàng là ('Bút chì', 80) / ('Tẩy', 120) / ('Vở', 250).

③ Cuối cùng, chạy SELECT * FROM product; và xác nhận 3 hàng với giá trị id được đánh số tự động.

SQL Editor

Chạy truy vấn để xem kết quả

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.

Tạo một bảng task_v2 tạm và quan sát INSERT bỏ qua cột vỡ sau ALTER TABLE.

① Xóa bảng cùng tên hiện có với DROP TABLE IF EXISTS task_v2;, sau đó tạo một bảng 2 cột với CREATE TABLE task_v2 (title TEXT, done INTEGER);.

② Chạy INSERT INTO task_v2 VALUES ('Đi chợ', 0); — câu này thành công khi bảng có 2 cột (dạng bỏ qua cột hoạt động).

③ Chạy ALTER TABLE task_v2 ADD COLUMN due_on TEXT; để thêm cột thứ 3.

④ Chạy lại INSERT INTO task_v2 VALUES ('Đọc sách', 0);. Lần này chỉ 2 giá trị cho 3 cột — câu này nên bị từ chối với lỗi.

(Bài tập này đúng khi có lỗi trả về.)

SQL Editor

Chạy truy vấn để xem kết quả
QUIZ

Kiểm tra kiến thức

Hãy trả lời từng câu hỏi một.

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?

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?