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