Câu lệnh INSERT
trong MySQL được sử dụng để thêm dữ liệu vào một bảng. Trong hướng dẫn này, chúng ta sẽ tìm hiểu chi tiết về cách sử dụng câu lệnh INSERT
, từ những ví dụ cơ bản cho đến các trường hợp phức tạp hơn.
1. Cấu trúc cơ bản của câu lệnh INSERT
Câu lệnh INSERT
cơ bản có cú pháp như sau:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...);
Trong đó:
table_name
: Tên bảng mà bạn muốn chèn dữ liệu vào.
column1, column2, column3, ...
: Các cột mà bạn muốn chèn giá trị vào.
value1, value2, value3, ...
: Các giá trị tương ứng với các cột đó.
Ví dụ cơ bản:
Giả sử bạn có một bảng users
với các cột id
, name
, và email
. Để chèn một dòng dữ liệu mới, bạn có thể dùng câu lệnh sau:
Câu lệnh trên sẽ chèn một dòng dữ liệu vào bảng users
với id
là 1, name
là ‘John Doe’, và email
là ‘[email protected]‘.
2. Chèn dữ liệu không cần chỉ định cột
Nếu bạn chèn giá trị vào tất cả các cột trong bảng và theo đúng thứ tự, bạn có thể bỏ qua phần danh sách cột. Cú pháp sẽ như sau:
INSERT INTO table_name
VALUES (value1, value2, value3, ...);
Ví dụ:
Câu lệnh trên sẽ chèn giá trị 2 vào cột id
, ‘Jane Smith’ vào cột name
, và ‘[email protected]‘ vào cột email
.
Lưu ý: Khi không chỉ định các cột, bạn phải đảm bảo rằng bạn cung cấp đủ giá trị cho tất cả các cột trong bảng và theo đúng thứ tự.
3. Chèn nhiều dòng dữ liệu cùng lúc
MySQL cho phép chèn nhiều dòng dữ liệu cùng lúc trong một câu lệnh INSERT
. Cú pháp như sau:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES
(value1_1, value1_2, value1_3, ...),
(value2_1, value2_2, value2_3, ...),
...
Ví dụ:
INSERT INTO users (id, name, email)
VALUES
(3, 'Alice Johnson', '[email protected]'),
(4, 'Bob Brown', '[email protected]'),
(5, 'Charlie Black', '[email protected]');
Câu lệnh trên sẽ chèn 3 dòng dữ liệu vào bảng users
.
4. Chèn dữ liệu với giá trị mặc định
Nếu bảng của bạn có các cột với giá trị mặc định (ví dụ cột created_at
có giá trị mặc định là thời gian hiện tại), bạn có thể bỏ qua các cột này khi thực hiện câu lệnh INSERT
. MySQL sẽ tự động chèn giá trị mặc định vào các cột này.
Ví dụ:
Giả sử bảng users
có cột created_at
với giá trị mặc định là CURRENT_TIMESTAMP
. Bạn có thể bỏ qua cột này trong câu lệnh INSERT
:
Trong trường hợp này, giá trị của cột created_at
sẽ được tự động thiết lập là thời gian hiện tại.
5. Sử dụng INSERT ... SELECT
Ngoài việc chèn dữ liệu từ một câu lệnh VALUES
, MySQL còn cho phép chèn dữ liệu từ kết quả của một câu truy vấn khác. Cú pháp như sau:
INSERT INTO table_name (column1, column2, column3, ...)
SELECT value1, value2, value3
FROM another_table
WHERE condition;
Ví dụ:
Giả sử bạn có bảng old_users
và muốn sao chép dữ liệu từ bảng này sang bảng users
. Bạn có thể dùng câu lệnh sau:
INSERT INTO users (id, name, email)
SELECT id, name, email
FROM old_users
WHERE email LIKE '%@example.com';
Câu lệnh trên sẽ chèn tất cả người dùng từ bảng old_users
có email kết thúc bằng @example.com
vào bảng users
.
6. Sử dụng ON DUPLICATE KEY UPDATE
Trong một số trường hợp, bạn muốn chèn dữ liệu nhưng nếu dòng dữ liệu đó đã tồn tại (dựa trên khóa chính hoặc khóa duy nhất), bạn có thể cập nhật giá trị của dòng đó thay vì chèn mới. Cú pháp sử dụng ON DUPLICATE KEY UPDATE
như sau:
INSERT INTO table_name (column1, column2, column3, ...)
VALUES (value1, value2, value3, ...)
ON DUPLICATE KEY UPDATE column1 = value1, column2 = value2, ...;
Ví dụ:
Giả sử bảng users
có cột email
là khóa duy nhất, bạn muốn chèn một dòng dữ liệu mới nhưng nếu email
đã tồn tại, bạn chỉ cần cập nhật tên của người dùng. Bạn có thể sử dụng câu lệnh sau:
INSERT INTO users (id, name, email)
VALUES (7, 'Eve White', '[email protected]')
ON DUPLICATE KEY UPDATE name = 'Eve White';
Nếu email
‘[email protected]‘ đã tồn tại, câu lệnh trên sẽ cập nhật tên của người dùng thành ‘Eve White’.
7. Xử lý lỗi với IGNORE
Khi thực hiện câu lệnh INSERT
, nếu có lỗi xảy ra (ví dụ vi phạm khóa chính hoặc khóa duy nhất), MySQL sẽ trả về lỗi và không thực hiện chèn dữ liệu. Tuy nhiên, bạn có thể sử dụng tùy chọn IGNORE
để bỏ qua các lỗi này và tiếp tục chèn các dòng khác.
Ví dụ:
INSERT IGNORE INTO users (id, name, email)
VALUES (8, 'Frank White', '[email protected]');
Nếu có lỗi xảy ra (ví dụ id
hoặc email
đã tồn tại), câu lệnh sẽ bỏ qua dòng đó mà không trả về lỗi.
8. Kết luận
Câu lệnh INSERT
trong MySQL là một công cụ mạnh mẽ để chèn dữ liệu vào bảng. Từ việc chèn đơn giản, đến việc chèn nhiều dòng, sao chép dữ liệu từ các bảng khác, và xử lý trường hợp dữ liệu đã tồn tại, MySQL cung cấp nhiều tùy chọn để linh hoạt hơn khi làm việc với cơ sở dữ liệu.
Ví dụ nâng cao về INSERT
Dưới đây là hướng dẫn nâng cao về câu lệnh INSERT
trong MySQL, bao gồm các trường hợp chuyên sâu hơn với ví dụ minh họa đầy đủ:
1. Chèn với các giá trị NULL
Trong MySQL, bạn có thể chèn các giá trị NULL
vào các cột cho phép NULL (các cột không có ràng buộc NOT NULL
).
Ví dụ:
Giả sử bạn có bảng employees
với các cột id
, name
, email
, và department
, trong đó department
có thể nhận giá trị NULL
. Bạn có thể chèn dữ liệu như sau:
INSERT INTO employees (id, name, email, department)
VALUES (1, 'Alice', '[email protected]', NULL);
Kết quả là NULL
sẽ được chèn vào cột department
của bản ghi này.
2. Chèn với các giá trị mặc định (DEFAULT
)
Trong MySQL, bạn có thể sử dụng từ khóa DEFAULT
để chèn các giá trị mặc định vào một cột. Điều này đặc biệt hữu ích khi bảng của bạn có các cột đã được định nghĩa với giá trị mặc định.
Ví dụ:
Giả sử bạn có bảng products
với các cột id
, name
, price
, và stock
(trong đó stock
có giá trị mặc định là 100). Bạn có thể sử dụng từ khóa DEFAULT
để chèn dữ liệu:
INSERT INTO products (id, name, price, stock)
VALUES (1, 'Laptop', 1500, DEFAULT);
Trong trường hợp này, giá trị DEFAULT
sẽ tự động chèn giá trị mặc định là 100 vào cột stock
.
3. Chèn với dữ liệu nhị phân (BLOB)
MySQL hỗ trợ các kiểu dữ liệu nhị phân (binary), như BLOB
và TEXT
, để lưu trữ dữ liệu như hình ảnh, tài liệu, hoặc các tệp nhị phân khác.
Ví dụ:
Giả sử bạn có bảng files
với các cột id
, name
, và content
(kiểu dữ liệu BLOB
), để chèn một tệp nhị phân, bạn có thể sử dụng câu lệnh sau:
INSERT INTO files (id, name, content)
VALUES (1, 'image.jpg', LOAD_FILE('/path/to/image.jpg'));
Hàm LOAD_FILE()
trong MySQL sẽ đọc tệp từ hệ thống và lưu trữ nó vào cột kiểu BLOB
.
4. Chèn với điều kiện WHERE
(Kết hợp với SELECT
)
Trong các trường hợp phức tạp, bạn có thể kết hợp câu lệnh INSERT
với SELECT
và điều kiện WHERE
để lọc dữ liệu trước khi chèn vào bảng đích.
Ví dụ:
Giả sử bạn có bảng old_users
và muốn chỉ chèn những người dùng từ old_users
có email thuộc miền example.com
vào bảng users
:
INSERT INTO users (id, name, email)
SELECT id, name, email
FROM old_users
WHERE email LIKE '%@example.com';
Câu lệnh trên chỉ chèn những người dùng có email kết thúc bằng @example.com
từ bảng old_users
vào bảng users
.
5. Chèn với thứ tự tự động tăng (AUTO_INCREMENT
)
Trong MySQL, nếu một bảng có cột AUTO_INCREMENT
, bạn có thể bỏ qua giá trị của cột này trong câu lệnh INSERT
, và MySQL sẽ tự động tăng giá trị của cột đó.
Ví dụ:
Giả sử bảng orders
có cột order_id
là AUTO_INCREMENT
, bạn không cần phải chỉ định giá trị cho cột này khi chèn dữ liệu:
INSERT INTO orders (customer_id, product_id, quantity)
VALUES (1, 101, 2);
MySQL sẽ tự động chèn giá trị cho cột order_id
.
6. Chèn từ khóa ngoại (Foreign Key)
Khi làm việc với các bảng có ràng buộc khóa ngoại, bạn phải đảm bảo rằng dữ liệu được chèn tương ứng với các khóa chính từ bảng cha.
Ví dụ:
Giả sử bạn có bảng orders
với cột customer_id
là khóa ngoại từ bảng customers
. Để chèn dữ liệu vào bảng orders
, customer_id
phải tồn tại trong bảng customers
:
INSERT INTO orders (customer_id, product_id, quantity)
VALUES (1, 101, 3);
Nếu customer_id = 1
không tồn tại trong bảng customers
, MySQL sẽ trả về lỗi Foreign key constraint fails
.
7. Chèn với ON DUPLICATE KEY UPDATE
Trong MySQL, bạn có thể sử dụng cú pháp ON DUPLICATE KEY UPDATE
để cập nhật dữ liệu nếu có xung đột trên khóa chính hoặc khóa duy nhất.
Ví dụ:
Giả sử bảng inventory
có cột product_id
là khóa chính, nếu bạn muốn cập nhật số lượng sản phẩm nếu sản phẩm đã tồn tại:
INSERT INTO inventory (product_id, product_name, quantity)
VALUES (101, 'Laptop', 50)
ON DUPLICATE KEY UPDATE quantity = quantity + 50;
Câu lệnh trên sẽ cập nhật số lượng sản phẩm Laptop
nếu product_id = 101
đã tồn tại, bằng cách cộng thêm 50 vào giá trị hiện tại.
8. Chèn với INSERT IGNORE
Khi bạn không muốn câu lệnh INSERT
trả về lỗi khi vi phạm ràng buộc (ví dụ khóa chính hoặc khóa duy nhất), bạn có thể sử dụng INSERT IGNORE
.
Ví dụ:
Giả sử bảng users
có cột email
là duy nhất, bạn có thể sử dụng INSERT IGNORE
để bỏ qua các bản ghi đã tồn tại:
Nếu email
‘[email protected]‘ đã tồn tại, câu lệnh này sẽ không gây lỗi và bản ghi sẽ bị bỏ qua.
9. Chèn với dữ liệu từ nhiều bảng (JOIN
)
Bạn có thể sử dụng INSERT
kết hợp với JOIN
để chèn dữ liệu từ nhiều bảng khác nhau vào một bảng đích.
Ví dụ:
Giả sử bạn có bảng products
và categories
, và bạn muốn chèn dữ liệu từ hai bảng này vào bảng product_summary
, bạn có thể dùng câu lệnh sau:
INSERT INTO product_summary (product_id, product_name, category_name)
SELECT p.id, p.name, c.category_name
FROM products p
JOIN categories c ON p.category_id = c.id;
Câu lệnh trên sẽ chèn dữ liệu từ bảng products
và categories
vào bảng product_summary
bằng cách kết hợp hai bảng dựa trên category_id
.
10. Sử dụng INSERT DELAYED
MySQL hỗ trợ từ khóa DELAYED
để chèn dữ liệu vào bảng nhưng không làm chậm quá trình xử lý của các truy vấn khác. DELAYED
chèn dữ liệu vào hàng đợi và thực hiện chèn sau đó.
Ví dụ:
INSERT DELAYED INTO log_table (event_type, event_time)
VALUES ('login', NOW());
Câu lệnh trên sẽ chèn một sự kiện vào bảng log_table
sau khi MySQL có thời gian rảnh để xử lý.
11. Chèn với dữ liệu tuần tự (SEQUENCE
)
MySQL không có hỗ trợ trực tiếp cho SEQUENCE
như trong một số hệ quản trị khác (Oracle, PostgreSQL). Tuy nhiên, bạn có thể sử dụng kết hợp hàm LAST_INSERT_ID()
để lấy giá trị AUTO_INCREMENT
cuối cùng sau khi chèn một dòng.
Ví dụ:
INSERT INTO orders (customer_id, product_id, quantity)
VALUES (1, 101, 2);
SELECT LAST_INSERT_ID();
Hàm LAST_INSERT_ID()
sẽ trả về order_id
cuối cùng được chèn tự động.
12. Sử dụng INSERT INTO ... SET
Một cách khác để chèn dữ liệu vào bảng là sử dụng từ khóa SET
, đặc biệt khi bạn muốn chỉ định giá trị cho các cột một cách rõ ràng hơn:
Ví dụ:
Cách này thường được sử dụng khi bạn muốn chèn từng cặp cột = giá trị
một cách dễ đọc hơn, đặc biệt khi số lượng cột lớn.
Kết luận
Câu lệnh INSERT
trong MySQL không chỉ đơn giản mà còn rất linh hoạt và mạnh mẽ. Những ví dụ nâng cao ở trên đã bao gồm hầu hết các trường hợp mà bạn có thể gặp khi làm việc với dữ liệu trong MySQL, từ việc chèn dữ liệu cơ bản đến các kỹ thuật tối ưu như INSERT IGNORE
, ON DUPLICATE KEY UPDATE
, và sử dụng kết hợp với các truy vấn khác.