Cách chèn dữ liệu trong MySQL

Cách chèn dữ liệu trong MySQL

Cơ bản

Cách đơn giản nhất để chèn một hàng trong MySQL là sử dụng lệnh INSERT INTO và chỉ định giá trị cho tất cả các cột. Nếu bạn có 10 cột, bạn phải chỉ định 10 giá trị theo thứ tự mà bảng đã được định nghĩa:

sql

-- Giả sử bảng users chỉ có ba cột: first_name, last_name và email, theo thứ tự đó
INSERT INTO users VALUES ('John', 'Doe', 'john@doe.com');

Chỉ định danh sách cột

Việc chỉ định danh sách cột trước từ khóa VALUES là tùy chọn, nhưng được khuyến nghị:

sql

INSERT INTO users (first_name, last_name, email, birth_date, city, state)
VALUES ('John', 'Doe', 'john@doe.com', '2000-01-01', 'Los Angeles', 'CA');

Việc có danh sách cột mang lại các lợi ích sau:

  • Bạn không cần nhớ thứ tự cột như đã định nghĩa trong bảng.
  • Bạn không cần chỉ định giá trị cho tất cả các cột, chỉ những cột bắt buộc.
  • Trong trường hợp có nhiều cột, dễ dàng khớp giá trị với cột tương ứng khi bạn thấy nó trong câu lệnh, thay vì phải xem định nghĩa bảng.
  • Các câu lệnh INSERT không có danh sách cột sẽ bị vô hiệu hóa khi một cột được thêm hoặc xóa khỏi bảng. Bạn cần sửa đổi truy vấn của mình để phản ánh cột mới hoặc đã xóa để chúng hoạt động lại.

Sử dụng từ khóa SET

Mặc dù không thường xuyên được sử dụng, MySQL cũng cho phép từ khóa SET trong câu lệnh INSERT. Điều này hữu ích khi có nhiều cột cần chèn vì nó dễ đọc hơn:

sql

INSERT INTO users SET
first_name = 'Vincent',
last_name = 'Aviles',
birth_date = '1973-08-14',
profession = 'Artist',
educational_attainment = 'College Degree',
city = 'Daly City',
current_points = 543,
date_registered = '2018-11-30';

Hạn chế của việc sử dụng từ khóa SET là nó chỉ có thể được sử dụng để chèn một hàng tại một thời điểm.

Cách chèn dữ liệu trong MySQL
Cách chèn dữ liệu trong MySQL

Chèn nhiều hàng

Bạn có thể chèn nhiều hàng trong một câu lệnh INSERT bằng cách có nhiều tập giá trị được bao trong dấu ngoặc đơn:

sql

INSERT INTO users (first_name, last_name)
VALUES
('John', 'Lennon'),
('Paul', 'McCartney'),
('George', 'Harrison'),
('Ringo', 'Starr');

Bạn cũng có thể sử dụng INSERT với lệnh SELECT để sao chép dữ liệu từ một bảng hiện có. Lưu ý từ khóa VALUES được bỏ qua:

sql

INSERT INTO beta_users (first_name, last_name)
SELECT first_name, last_name
FROM users
WHERE beta = 1;

Chèn giá trị JSON

Bắt đầu từ phiên bản 5.7.8, MySQL hỗ trợ các kiểu dữ liệu JSON. Nếu bạn muốn chèn vào một cột JSON, chỉ cần bao JSON hợp lệ trong một chuỗi được trích dẫn đơn:

sql

INSERT INTO test_json
VALUES ('{"beta": true, "status": "for review", "test_count": 1}');

Xử lý xung đột/trùng lặp

Nếu việc chèn một hàng vi phạm ràng buộc duy nhất, có các cách khác nhau để xử lý, tùy thuộc vào yêu cầu của bạn.

Sử dụng INSERT IGNORE sẽ lặng lẽ bỏ qua hàng cần chèn:

sql

INSERT IGNORE
INTO products (product_id, product_name, stocks)
VALUES (1, 'VPN Product 1', 50);

Xem cách thức hoạt động:

mysql> create table products
-> (product_id int not null primary key, product_name varchar(100), stocks int);
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT IGNORE INTO products (product_id, product_name, stocks)
-> VALUES (1, 'VPN Product 1', 50);
Query OK, 1 row affected (0.01 sec)

mysql> select * from products;
+------------+---------------+--------+
| product_id | product_name | stocks |
+------------+---------------+--------+
|            1 | VPN Product 1 | 50  |
+------------+---------------+--------+
1 row in set (0.00 sec)

mysql> INSERT IGNORE INTO products (product_id, product_name, stocks)
-> VALUES (1, 'VPN Product 1', 40);
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select * from products;
+------------+---------------+--------+
| product_id | product_name | stocks |
+------------+---------------+--------+
|            1 | VPN Product 1 | 50  |
+------------+---------------+--------+
1 row in set (0.00 sec)

Lưu ý rằng giá trị stocks không thay đổi.

Nếu bạn muốn thực hiện "upsert" (cập nhật hàng nếu tồn tại, nếu không thì chèn), bạn có thể sử dụng INSERT... ON DUPLICATE KEY UPDATE:

sql

INSERT INTO products (product_id, product_name, stocks)
VALUES (1, 'VPN Product 1', 45)
ON DUPLICATE KEY UPDATE stocks = VALUES(stocks);

Cách thức hoạt động:

mysql> INSERT INTO products (product_id, product_name, stocks)
-> VALUES (1, 'VPN Product 1', 45)
-> ON DUPLICATE KEY UPDATE stocks=VALUES(stocks);
Query OK, 2 rows affected (0.00 sec)

mysql> select * from products;
+------------+---------------+--------+
| product_id | product_name | stocks |
+------------+---------------+--------+
|            1 | VPN Product 1 | 45  |
+------------+---------------+--------+
1 row in set (0.00 sec)

MySQL cũng có từ khóa REPLACE. Khi phát hiện ra bản sao, nó sẽ xóa hàng xung đột và chèn hàng mới.

Ví dụ:

REPLACE INTO products (product_id, product_name, stocks)
VALUES (1, 'VPN Product 1', 45)
ON DUPLICATE KEY UPDATE stocks = VALUES(stocks);

Hãy cẩn thận khi sử dụng REPLACE so với INSERT ON DUPLICATE KEY vì REPLACE xóa toàn bộ hàng, do đó nó ảnh hưởng đến khóa ngoại và có thể tạo ra kết quả không mong muốn nếu bảng sử dụng AUTO_INCREMENT để gán giá trị.

Tham khảo thêm dữ liệu nếu không tồn tại trên Stackoverflow

TAGS: mysql
About the Author