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:

INSERT INTO users (id, name, email)
VALUES (1, 'John Doe', '[email protected]');

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ụ:

INSERT INTO users
VALUES (2, 'Jane Smith', '[email protected]');

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:

INSERT INTO users (id, name, email)
VALUES (6, 'David Green', '[email protected]');

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ư BLOBTEXT, để 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_idAUTO_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:

INSERT IGNORE INTO users (id, name, email)
VALUES (9, 'Frank', '[email protected]');

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 productscategories, 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 productscategories 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ụ:

INSERT INTO users
SET id = 10, name = 'George', email = '[email protected]';

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.