Đôi khi bạn có thể cần chèn nhiều hàng dữ liệu trong MySQL. MySQL cho phép bạn nhập nhiều hàng thông tin với một truy vấn duy nhất. Trong bài viết này, chúng ta sẽ xem xét cách chèn nhiều hàng trong MySQL
Cách chèn nhiều hàng trong MySQL
Dưới đây là các bước để chèn nhiều hàng trong MySQL. Có nhiều cách để chèn nhiều hàng trong MySQL. Chúng ta sẽ xem xét từng phương pháp một
Chèn nhiều hàng bằng INSERT
Giả sử bạn có bảng nhân viên sau [id, first_name, last_name]
mysql> create table employees[id int, first_name varchar[255], last_name varchar[255]];
Đây là cú pháp để chèn nhiều hàng bằng câu lệnh INSERT
INSERT INTO table_name[column1, column2, ...], values[row1_value1, row1_value2,...], [row2_value1, row2_value2,...], ...
Trong truy vấn trên, bạn cần đề cập đến tên bảng mà bạn cần chèn giá trị vào đó. Tiếp theo, bạn cần nhập các giá trị của từng hàng được đặt trong dấu ngoặc tròn '[]' theo cách phân tách bằng dấu phẩy
Cũng đọc. Cách sao chép dữ liệu từ bảng này sang bảng khác
Đây là truy vấn SQL để chèn nhiều hàng thông tin vào bảng nhân viên
mysql> insert into employees[id, first_name, last_name]
values[1,'John','Doe'],
[2,'Jane','Doe'];
mysql> select * from employees;
+------+------------+-----------+
| id | first_name | last_name |
+------+------------+-----------+
| 1 | John | Doe |
| 2 | Jane | Doe |
+------+------------+-----------+
Cũng đọc. Cách cập nhật một cột dựa trên một cột khác
Chèn nhiều hàng từ CHỌN
Bạn cũng có thể chèn nhiều hàng dữ liệu vào bảng của mình bằng cách sử dụng kết quả của truy vấn CHỌN
Đây là cú pháp truy vấn SQL để sao chép dữ liệu từ bảng này sang bảng khác bằng cách sử dụng câu lệnh INSERT INTO
INSERT INTO table1 [column1, column2, ...] select column1, column2, ... from table2
Trong câu truy vấn trên, chúng ta chọn cột1, cột2,… từ bảng2 và chèn chúng vào bảng1
Xin lưu ý, các cột được sử dụng trong câu lệnh INSERT INTO và câu lệnh SELECT phải có cùng tên và thứ tự. Nếu không, bạn sẽ gặp lỗi
Đây là câu truy vấn SQL để sao chép dữ liệu từ bảng employee sang bảng employee2
mysql> insert into employees2[id, first_name, last_name] select id, first_name, last_name from employees; mysql> select * from employees2; +------+------------+-----------+ | id | first_name | last_name | +------+------------+-----------+ | 1 | John | Doe | | 2 | Jane | Doe | +------+------------+-----------+
Cũng đọc. Cách cập nhật nhiều cột trong MySQL
Chèn nhiều hàng không trùng lặp
Nếu bạn muốn tự động tránh các bản ghi trùng lặp khi chèn nhiều giá trị vào bảng của mình, hãy sử dụng từ khóa IGNORE sau INSERT trong truy vấn SQL của bạn
Chào mừng đến với hướng dẫn không. 3 trong loạt bài hướng dẫn về MySQL của chúng tôi. Trong hướng dẫn trước, chúng ta đã thảo luận về việc tạo bảng và chèn hàng vào bảng. Trong hướng dẫn này, chúng ta sẽ tìm hiểu cách chọn một hàng cũng như nhiều hàng từ một bảng
Chọn một hàng
Bảng
select product_price from product where product_name = ?
2 mà chúng ta đã tạo trong hướng dẫn trước có ba hàng. Chạy select product_price from product where product_name = ?
3 trên bảng trả về các hàng sauTrong phần hướng dẫn này, chúng ta sẽ viết mã để chọn một hàng từ bảng này. Chúng ta sẽ viết một hàm trả về giá sản phẩm khi tên sản phẩm được nhập làm đầu vào. Truy vấn để làm điều này được cung cấp dưới đây
select product_price from product where product_name = "iphone";
Truy vấn trên sẽ trả về một hàng và sẽ trả về cột
select product_price from product where product_name = ?
4 từ hàng đó. Truy vấn trên sẽ trả về select product_price from product where product_name = ?
5Bây giờ chúng ta đã có truy vấn sẵn sàng, hãy tiếp tục và viết mã cho nó
Bước đầu tiên là tạo một tuyên bố đã chuẩn bị. Các câu lệnh đã chuẩn bị được sử dụng để tham số hóa một truy vấn SQL để có thể chạy cùng một truy vấn với các đối số khác nhau một cách hiệu quả. Nó cũng ngăn sql injection
Mẫu cho tuyên bố đã chuẩn bị được cung cấp dưới đây
select product_price from product where product_name = ?
Chúng tôi đã thay thế
select product_price from product where product_name = ?
6 bằng select product_price from product where product_name = ?
7 để tạo mẫu tuyên bố đã chuẩn bịBước tiếp theo là tạo câu lệnh đã chuẩn bị. Điều này được thực hiện bằng cách sử dụng phương thức PrepareContext
func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
Chúng tôi chuyển ngữ cảnh có thời gian chờ thứ hai là
select product_price from product where product_name = ?
8 cho phương thức select product_price from product where product_name = ?
9 trong dòng số. 5. Phương thức này trả về một câu lệnh đã chuẩn bị. Chúng tôi trì hoãn việc đóng tuyên bố ở dòng không. 10Bước tiếp theo là thực hiện câu lệnh đã chuẩn bị này. Điều này được thực hiện bằng phương thức QueryRowContext
var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
Phương thức
func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
0 được gọi trên câu lệnh đã chuẩn bị func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
1. Phương thức này lấy một bối cảnh và một danh sách các đối số biến đổi làm tham số. Trong trường hợp của chúng tôi, chúng tôi chỉ có một đối số trong truy vấn là tên sản phẩm và chúng tôi chuyển đối số này làm đối số cho phương thức nàyfunc selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
0 trả về một hàng. Sau đó, chúng ta cần gọi func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
3 trên func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
4 để sao chép các cột được truy vấn trả về vào con trỏ được truyền cho phương thức func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
3. Ở đây chúng tôi chuyển một con trỏ số nguyên trong dòng số. 3 của đoạn mã trên mà giá sẽ được lưu trữ. Nếu truy vấn trả về nhiều hơn một hàng, phương thức func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
3 sẽ chỉ trả về hàng đầu tiên và sẽ không có lỗi. Nếu không có hàng nào được trả về, func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
3 sẽ trả về lỗi. Chúng ta sẽ thảo luận về xử lý lỗi trong phần tiếp theoChức năng hoàn chỉnh được cung cấp dưới đây
func selectPrice[db *sql.DB, productName string] [int, error] {
log.Printf["Getting product price"]
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
return price, nil
}
xử lý lỗi
Phương pháp
func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
3 được sử dụng trong dòng số. 14 của hàm trên sẽ trả về lỗi func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
9 khi truy vấn không trả về hàng nào. Hãy gọi hàm var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
0 của chúng ta từ var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
1 nơi sẽ xử lý lỗifunc main[] {
...
productName := "iphone"
price, err := selectPrice[db, productName]
switch {
case err == sql.ErrNoRows:
log.Printf["Product %s not found in DB", productName]
case err != nil:
log.Printf["Encountered err %s when fetching price from DB", err]
default:
log.Printf["Price of %s is %d", productName, price]
}
}
Chúng tôi chuyển tên sản phẩm là
select product_price from product where product_name = ?
6 thành var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
0 và sau đó chuyển đổi trường hợp lỗi. Nếu lỗi thuộc loại func selectPrice[db *sql.DB, productName string] [int, error] {
query := `select product_price from product where product_name = ?`
ctx, cancelfunc := context.WithTimeout[context.Background[], 5*time.Second]
defer cancelfunc[]
stmt, err := db.PrepareContext[ctx, query]
if err != nil {
log.Printf["Error %s when preparing SQL statement", err]
return 0, err
}
defer stmt.Close[]
...
}
9 ta in ra thông báo không tìm thấy sản phẩm. Trong trường hợp có bất kỳ lỗi nào khác, chúng tôi in thông báo lỗi. Và trong trường hợp var price int
row := stmt.QueryRowContext[ctx, productName]
if err := row.Scan[&price]; err != nil {
return 0, err
}
5, chúng tôi in kết quảChương trình này sẽ in
Price of iphone is 950
Chọn nhiều hàng
Trong phần này, chúng ta sẽ tìm hiểu cách chọn nhiều hàng từ một bảng. Chúng ta sẽ viết một hàm lấy giá tối thiểu và giá tối đa làm tham số và trả về tên và giá của các sản phẩm khớp với truy vấn
Truy vấn thực hiện điều đó được cung cấp bên dưới
select product_name, product_price from product where product_price >= 900 && product_price = ? && product_price