Câu lệnh INSERT trong SQL là một công cụ thiết yếu để thêm dữ liệu mới vào các bảng trong cơ sở dữ liệu. Từ việc chèn một bản ghi đơn giản, thêm nhiều bản ghi cùng lúc, đến sao chép dữ liệu từ các bảng khác, lệnh này mang lại sự linh hoạt và hiệu quả trong quản lý dữ liệu.
Đọc bài viết này để hiểu rõ hơn về:
- Cú pháp và cách hoạt động của lệnh INSERT
- Ứng dụng của lệnh INSERT trong thực tế
Tổng quan về câu lệnh INSERT trong SQL
Lệnh INSERT là lệnh dùng để thêm dữ liệu mới vào bảng trong cơ sở dữ liệu. Với lệnh này, ta có thể thêm một hoặc nhiều bản ghi cùng lúc tùy thuộc vào nhu cầu. INSERT thường được sử dụng trong các ứng dụng thực tế như lưu thông tin khách hàng mới, thêm sản phẩm vào danh sách hoặc ghi nhận giao dịch mới.
Đây là một công cụ cơ bản nhưng rất mạnh mẽ để xây dựng và quản lý dữ liệu trong cơ sở dữ liệu, giúp hệ thống hoạt động hiệu quả và chính xác.
Thành phần của câu lệnh INSERT trong SQL
Lệnh INSERT trong SQL có cú pháp cơ bản như sau:
INSERT INTO table_name (column1, column2, column3, ...) VALUES (value1, value2, value3, ...);
Các thành phần chính bao gồm:
- INSERT INTO table_name: Xác định tên bảng mà bạn muốn thêm dữ liệu.
- Danh sách cột: Xác định các cột mà dữ liệu sẽ được thêm vào. Nếu bỏ qua, dữ liệu sẽ được thêm theo thứ tự mặc định của tất cả các cột trong bảng.
- VALUES: Chỉ định các giá trị cần thêm vào bảng tương ứng với số lượng và kiểu dữ liệu của danh sách cột được khai báo. Nếu danh sách cột không được chỉ định, giá trị phải khớp với danh sách cột mặc định của bảng.
- Truy vấn con (tuỳ chọn): Thay vì VALUES, bạn có thể sử dụng một truy vấn con để chèn dữ liệu từ một bảng khác.
Câu lệnh INSERT trong SQL hoạt động như thế nào?
Khi thực thi lệnh INSERT, hệ quản trị cơ sở dữ liệu thực hiện các bước sau:
- Xác định bảng mục tiêu: Hệ thống xác định bảng được chỉ định trong câu lệnh INSERT INTO.
- Kiểm tra cột và giá trị: Xác minh danh sách cột (nếu có) và kiểm tra số lượng, kiểu dữ liệu của các giá trị trong mệnh đề VALUES. Nếu không cung cấp danh sách cột, hệ thống sẽ áp dụng giá trị cho tất cả các cột theo thứ tự mặc định.
- Thêm dữ liệu mới: Một bản ghi mới được tạo với các giá trị được cung cấp và chèn vào bảng mục tiêu. Các giá trị mặc định hoặc giá trị NULL sẽ được áp dụng cho cột không có dữ liệu trong lệnh.
- Kiểm tra ràng buộc và chỉ mục: Ràng buộc như khóa chính, khóa ngoại hoặc ràng buộc NOT NULL được kiểm tra trước khi hoàn tất. Đồng thời, hệ thống sẽ cập nhật chỉ mục (index) nếu có trong bảng.
- Lưu trữ bản ghi: Nếu dữ liệu hợp lệ, bản ghi mới sẽ được lưu trữ trong bảng. Nếu có lỗi, lệnh sẽ bị hủy hoặc chỉ bỏ qua bản ghi bị lỗi, tùy thuộc vào cách xử lý của hệ quản trị cơ sở dữ liệu.
Các trường hợp sử dụng câu lệnh INSERT trong SQL
Thêm một bản ghi (Insert Single Row)
Thêm dữ liệu cơ bản
Đây là trường hợp đơn giản nhất, sử dụng khi bạn muốn thêm một dòng dữ liệu vào bảng. Nếu bảng có cột id được thiết lập tự động tăng (AUTO_INCREMENT), bạn không cần tự điền giá trị cho cột id vì hệ thống sẽ tự động tạo và tăng giá trị này mỗi khi bạn thêm một dòng dữ liệu mới.
Ví dụ: Giả sử ta có bảng Employees với các thuộc tính: id (AUTO_INCREMENT), name, age, position. Để thêm thông tin nhân viên Alice vào bảng Employees, ta sử dụng cú pháp:
INSERT INTO Employees (name, age, position) VALUES ('Alice', 25, 'Developer');
Kết quả sau khi thực hiện lệnh:
id | name | age | position |
1 | Alice | 25 | Developer |
Giải thích: Ở đây, hệ thống tự động gán id = 1 cho bản ghi mới, mà bạn không cần chỉ định giá trị này trong câu lệnh INSERT, giúp bạn tiết kiệm thời gian và tránh lỗi khi làm việc với các giá trị id.
Thêm dữ liệu tự động điền giá trị mặc định
Bên cạnh đó, khi bảng có các cột được cấu hình giá trị mặc định, ta có thể bỏ qua việc cung cấp giá trị cho các cột đó. Như trong MySQL, nếu một cột được thiết lập giá trị mặc định bằng DEFAULT, bạn có thể bỏ qua nó khi thêm dữ liệu.
Ví dụ: Ta có bảng Orders với các cột customer_id, product_id, created_at (trong đó created_at mặc định là ngày hiện tại CURRENT_DATE). Để thêm một bản ghi mà không cần cung cấp giá trị cho order_date, ta sử dụng cú pháp sau:
INSERT INTO Orders (customer_id, product_id) VALUES (1, 101);
Kết quả sau khi thực hiện lệnh:
order_id | customer_id | product_id | created_at |
1 | 1 | 101 | 2025-01-25 |
Giải thích: Lệnh trên sẽ thêm một đơn hàng mới vào bảng Orders với giá trị created_at tự động nhận giá trị là ngày hiện tại (CURRENT_DATE).
Thêm dữ liệu với giá trị NULL
Khi không có giá trị cụ thể để thêm vào một số cột, bạn có thể sử dụng NULL.
Ví dụ: Ta có bảng Products với các cột name, price, category, nếu giá trị price chưa được xác định, ta có thể thêm một bản ghi với giá trị NULL với cú pháp như sau:
INSERT INTO Products (name, price, category) VALUES ('Tablet', NULL, 'Electronics') ('Laptop', 1500, 'Electronics');
Kết quả sau khi thực hiện lệnh:
product_id | name | price | category |
1 | Tablet | NULL | Electronics |
2 | Laptop | 1500 | Electronics |
Giải thích: Sản phẩm Tablet có giá trị price = NULL vì giá chưa xác định, trong khi sản phẩm Laptop được nhập đầy đủ thông tin.
Thêm dữ liệu có điều kiện để kiểm tra trùng lặp:
Để tránh trùng lặp dữ liệu, ta có thể sử dụng các câu lệnh kiểm tra trùng lặp trước khi thêm. Tùy vào mỗi hệ quản trị cơ sở dữ liệu thì cú pháp sẽ khác nhau.
Ví dụ (với MySQL) để thêm bản ghi về nhân viên Alice và kiểm tra xem đã có bản ghi trùng về tên (name), tuổi (age) và vị trí (position) chưa, ta có thể sử dụng cú pháp sau:
INSERT INTO Employees (id, name, age, position) VALUES (1, 'Alice', 25, 'Developer') ON DUPLICATE KEY UPDATE name = VALUES(name), age = VALUES(age), position = VALUES(position);
Kết quả sau khi thực hiện lệnh:
id | name | age | position |
1 | Alice | 25 | Developer |
Giải thích: Nếu bản ghi với id = 1 đã tồn tại, thông tin của Alice sẽ được cập nhật thay vì thêm bản ghi mới.
Thêm nhiều bản ghi cùng lúc (Insert Multiple Rows)
Ta có thể thêm nhiều bản ghi trong một lệnh duy nhất bằng cách cung cấp nhiều giá trị trong mệnh đề VALUES.
Ví dụ: Để thêm thông tin ba nhân viên mới vào bảng Employees ta sử dụng cú pháp:
INSERT INTO Employees (name, age, position) VALUES ('Bob', 30, 'Designer'), ('Charlie', 35, 'Manager'), ('Daisy', 28, 'Tester');
Kết quả sau khi thực hiện lệnh:
id | name | age | position |
1 | Alice | 25 | Developer |
2 | Bob | 30 | Designer |
3 | Charlie | 35 | Manager |
4 | Daisy | 28 | Tester |
Sao chép dữ liệu từ một bảng khác (Insert Using SELECT)
Lệnh INSERT có thể kết hợp với câu lệnh SELECT để sao chép dữ liệu từ bảng này sang bảng khác. Ví dụ: Để sao chép tất cả các đơn hàng trước ngày 01/01/2024 từ bảng Orders sang bảng Archived_Orders ta sử dụng cú pháp:
INSERT INTO Archived_Orders (order_id, customer_id, order_date) SELECT order_id, customer_id, order_date FROM Orders WHERE order_date < '2024-01-01';
Bảng Archived_Oders sau khi thực thực hiện lệnh:
order_id | customer_id | product_id | created_at |
Giải thích: Không có bản ghi nào từ bảng Orders thỏa mãn điều kiện order_date < ‘2024-01-01’, nên không có bản ghi nào được sao chép sang bảng Archived_Orders.
Thêm dữ liệu bằng cách sử dụng truy vấn phụ
Ngoài ra, ta có thể chèn dữ liệu dựa trên kết quả của một truy vấn phụ. Giả sử ta có bảng Transactions như sau:
transaction_id | customer_id | amount |
1 | 1 | 5000 |
2 | 1 | 10000 |
3 | 2 | 2000 |
4 | 3 | 7000 |
5 | 3 | 5000 |
Ví dụ: Để thêm vào bảng HighValueCustomers tất cả các khách hàng có tổng chi tiêu vượt quá 10,000 từ bảng Transactions ta sử dụng cú pháp:
INSERT INTO HighValueCustomers (customer_id, total_spent) SELECT customer_id, SUM(amount) FROM Transactions GROUP BY customer_id HAVING SUM(amount) > 10000;
Bảng HighValueCustomers sẽ trở thành:
customer_id | total_spent |
1 | 15000 |
3 | 12000 |
Giải thích: Từ bảng Transactions, lệnh tính tổng số tiền chi tiêu (SUM(amount)) của từng khách hàng (customer_id) và chỉ giữ lại những khách hàng có tổng chi tiêu lớn hơn 10000 nhờ mệnh đề HAVING. Kết quả là khách hàng 1 với tổng chi tiêu 15000 và khách hàng 3 với tổng chi tiêu 12000 được thêm vào bảng HighValueCustomers
Câu hỏi thường gặp về câu lệnh INSERT trong SQL
Cần làm gì nếu giá trị muốn chèn trùng với khóa chính?
Nếu giá trị muốn chèn trùng với khóa chính đã tồn tại, MySQL sẽ báo lỗi do vi phạm ràng buộc. Để xử lý, bạn có thể:
Bỏ qua bản ghi trùng lặp
Sử dụng INSERT IGNORE để MySQL bỏ qua bản ghi gây lỗi. Tuy nhiên, việc sử dụng IGNORE không được xem là một giải pháp thực sự vì bản ghi trùng lặp sẽ không được phát hiện và không được giải quyết. Ví dụ:
INSERT IGNORE INTO table_name (id, column1) VALUES (1, 'value1');
Cập nhật dữ liệu nếu trùng lặp
Sử dụng INSERT … ON DUPLICATE KEY UPDATE để cập nhật bản ghi nếu khóa chính đã tồn tại. Ví dụ:
INSERT INTO table_name (id, column1) VALUES (1, 'value1') ON DUPLICATE KEY UPDATE column1 = 'updated_value';
Giải thích: Khi id = 1 đã tồn tại, giá trị của column1 sẽ được cập nhật thành ‘updated_value’. Phương pháp này phù hợp trong trường hợp bạn muốn giữ lại bản ghi cũ nhưng cập nhật một số thông tin.
Đọc thêm: Câu lệnh Update trong SQL: Các thành phần và cách hoạt động
Xóa bản ghi cũ và chèn bản ghi mới
Nếu bạn muốn hoàn toàn thay thế bản ghi cũ bằng bản ghi mới, bạn có thể xóa bản ghi cũ trước khi chèn bản ghi mới.
Sử dụng REPLACE để thay thế bản ghi cũ
Trong MySQL, bạn có thể sử dụng mệnh đề REPLACE để thay thế bản ghi cũ khi có xung đột với khóa chính. Lệnh này tự động xóa bản ghi cũ và chèn bản ghi mới vào bảng. Ví dụ:
REPLACE INTO table_name (id, column1) VALUES (1, 'new_value');
Giải thích: Khi id = 1 đã tồn tại, MySQL sẽ xóa bản ghi cũ và thêm bản ghi mới với id = 1. Phương pháp này phù hợp khi bạn cần thay thế toàn bộ dữ liệu của bản ghi.
Có thể chèn dữ liệu mà không chỉ định tất cả các cột không?
Có, bạn có thể chỉ định một số cột cụ thể trong lệnh INSERT, miễn là các cột còn lại:
- Được thiết lập giá trị mặc định (DEFAULT).
- Được phép chứa giá trị NULL.
Hoặc bạn có thể không cần chỉ định cột trong câu lệnh INSERT. Tuy nhiên điều này yêu cầu các giá trị trong mệnh đề VALUES phải tương ứng với tất cả cột trong bảng.
Làm sao để chèn giá trị mặc định vào cột?
Bạn có thể sử dụng từ khóa DEFAULT để chèn giá trị mặc định được thiết lập trước cho một cột. Ví dụ:
INSERT INTO Orders (customer_id, product_id, order_date) VALUES (1, 101, DEFAULT);
Giải thích: cột order_date sẽ tự động nhận giá trị mặc định được cấu hình (như CURRENT_DATE). Nếu không chỉ định, MySQL cũng tự động áp dụng giá trị mặc định cho các cột không được nêu trong câu lệnh INSERT.
Có thể chèn dữ liệu mà không chỉ định tất cả các cột không?
Có, bạn chỉ cần nêu các cột cần chèn dữ liệu trong câu lệnh INSERT. Các cột không được đề cập sẽ tự động nhận giá trị mặc định hoặc NULL (nếu cho phép).
INSERT INTO Orders (customer_id, product_id) VALUES (1, 101);
Giải thích: Cột không được nêu như created_at sẽ tự động nhận giá trị mặc định (ví dụ: CURRENT_DATE).
Tổng kết câu lệnh INSERT trong SQL
Về cơ bản, câu lệnh INSERT trong SQL giúp bạn dễ dàng thêm dữ liệu mới vào bảng và nó đóng vai trò quan trọng trong việc duy trì và phát triển hệ thống cơ sở dữ liệu. Việc nắm vững cú pháp và các trường hợp sử dụng sẽ giúp bạn tối ưu hóa việc quản lý dữ liệu, từ chèn dữ liệu đơn giản đến xử lý tình huống phức tạp.
ITviec hy vọng bài viết trên đã cung cấp đủ thông tin giúp bạn hiểu và sử dụng lệnh INSERT hiệu quả.