Làm cách nào để có nhiều hàng trong MySQL?

Đô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 sau

Làm cách nào để có nhiều hàng trong MySQL?

Trong 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 = ?  
5

Bâ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. 10

Bướ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ày

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

Chứ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ỗi

func 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 <= 1000;  

Truy vấn trên sẽ trả về tên và giá của tất cả các sản phẩm có giá nằm trong khoảng từ

var price int  
row := stmt.QueryRowContext(ctx, productName)  
if err := row.Scan(&price); err != nil {  
    return 0, err
}
6 đến
var price int  
row := stmt.QueryRowContext(ctx, productName)  
if err := row.Scan(&price); err != nil {  
    return 0, err
}
7

Hầu hết các bước để chọn nhiều hàng tương tự như chọn một hàng mà chúng ta đã thảo luận trong phần trước. Tôi đã cung cấp chức năng hoàn chỉnh để chọn nhiều hàng bên dưới

func selectProductsByPrice(db *sql.DB, minPrice int, maxPrice int) ([]product, error) {  
    log.Printf("Getting products by price")
    query := `select product_name, product_price from product where product_price >= ? && product_price <= ?;`
    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 []product{}, err
    }
    defer stmt.Close()
    rows, err := stmt.QueryContext(ctx, minPrice, maxPrice)
    if err != nil {
        return []product{}, err
    }
    defer rows.Close() 
    var products = []product{}
    for rows.Next() {
        var prd product
        if err := rows.Scan(&prd.name, &prd.price); err != nil {
            return []product{}, err
        }
        products = append(products, prd)
    }
    if err := rows.Err(); err != nil {
        return []product{}, err
    }
    return products, nil
}

Tương tự như phần trước, đầu tiên chúng ta tạo một câu lệnh chuẩn bị ở dòng số. 6 chức năng trên. Sau đó, chúng tôi gọi phương thức

var price int  
row := stmt.QueryRowContext(ctx, productName)  
if err := row.Scan(&price); err != nil {  
    return 0, err
}
8 trên câu lệnh đã chuẩn bị sẵ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()
    ...
}
1 ở dòng số. 12. Phương thức này sẽ trả về danh sách các hàng được chọn bởi truy vấn. Chúng tôi trì hoãn việc đóng các hàng trong dòng không. 16

Sau khi nhận được danh sách hàng, chúng tôi gọi phương thức

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
}
0 trên
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
}
1 trong dòng số. 18. Điều này chuẩn bị kết quả để đọc bằng 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. Nếu có bất kỳ lỗi nào khi gọi
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
}
3, nó sẽ trả về
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
}
4 và vòng lặp for sẽ kết thúc. Trong trường hợp có lỗi, phương thức
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
}
5 trên
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
}
1 sẽ trả về một giá trị không phải là
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
}
7 và chúng ta cần gọi phương thức đó để tìm hiểu xem có bất kỳ lỗi nào khi ______25_______3 được gọi hay không. Điều này được thực hiện trong dòng không. 25

Nếu không có lỗi khi tìm nạp các hàng,

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
}
1 sẽ tự động được đóng bởi lệnh gọi phương thức
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
}
3 trong dòng số. 18. Nếu có bất kỳ lỗi nào, cần phải gọi rõ ràng cho
func 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)
    }
}
1. Vì lệnh gọi tới
func 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)
    }
}
2 là idempotent, bạn có thể gọi nó hai lần i. e một lần trong cuộc gọi
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
}
3 thành công và một lần nữa trong thời gian hoãn xếp hàng. 16. Do đó, chúng tôi đã trì hoãn các hàng đóng trong dòng không. 16

trong dòng không. 19 ta tạo

func 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)
    }
}
4 kiểu
select product_price from product where product_name = ?  
2 để lưu trữ kết quả

Trong trường hợp bạn không nhớ, cấu trúc

select product_price from product where product_name = ?  
2 có các trường sau

type product struct {  
    name  string
    price int
}

trong dòng không. 20, các cột kết quả được sao chép vào các trường

func 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)
    }
}
7 và
func 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)
    }
}
8 của cấu trúc
func 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)
    }
}
4 và trong dòng số. 23,
func 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)
    }
}
4 được thêm vào
Price of iphone is 950  
1

Price of iphone is 950  
1 được trả về trong dòng số. 28

Bước tiếp theo là gọi hàm này từ main

select product_price from product where product_name = ?  
0

Chúng tôi vượt qua

var price int  
row := stmt.QueryRowContext(ctx, productName)  
if err := row.Scan(&price); err != nil {  
    return 0, err
}
6 và
var price int  
row := stmt.QueryRowContext(ctx, productName)  
if err := row.Scan(&price); err != nil {  
    return 0, err
}
7 là giá tối thiểu và tối đa cho hàm
Price of iphone is 950  
5 trong dòng số. 5

Nếu có bất kỳ lỗi nào, chúng tôi sẽ quay lại sau khi in lỗi

Nếu không có lỗi, tên và giá của sản phẩm phù hợp với truy vấn được in trong dòng số. 11

Chương trình này sẽ in,

select product_price from product where product_name = ?  
1

Điều này đưa chúng ta đến cuối hướng dẫn này. Hãy chia sẻ thông tin phản hồi có giá trị của bạn trong các ý kiến

Toàn bộ mã có sẵn tại https. //github. com/golangbot/mysqltutorial/blob/master/select/main. đi

Nếu bạn muốn quảng cáo trên trang web này, hãy thuê tôi hoặc nếu bạn có bất kỳ yêu cầu phát triển nào khác, vui lòng gửi email tới naveen[at]golangbot[dot]com

Giống như hướng dẫn của tôi? . Đóng góp của bạn sẽ giúp tôi tạo ra nhiều hướng dẫn tuyệt vời hơn

Làm cách nào để tìm nạp nhiều hàng trong MySQL?

Đang tìm nạp nhiều hàng .
Khai báo một con trỏ cho một câu lệnh SELECT cụ thể, sử dụng câu lệnh DECLARE
Mở con trỏ bằng câu lệnh OPEN
Truy xuất từng hàng từ con trỏ một lần bằng cách sử dụng câu lệnh FETCH. Tìm nạp các hàng cho đến khi cảnh báo SQLE_NOTFOUND được trả về. .
Đóng con trỏ, sử dụng câu lệnh CLOSE

Làm cách nào để có nhiều hàng trong một hàng trong MySQL?

Hàm GROUP_CONCAT() trong MySQL được sử dụng để nối dữ liệu từ nhiều hàng vào một trường. Đây là hàm tổng hợp (GROUP BY) trả về giá trị Chuỗi, nếu nhóm chứa ít nhất một giá trị không NULL.

Làm cách nào để chèn 100 hàng trong SQL?

Để cộng các hàng, người dùng cần sử dụng câu lệnh chèn. .
cú pháp
Ví dụ – Một bảng có tên sinh viên phải được chèn các giá trị vào đó. Nó phải được thực hiện như sau
Đầu ra –
Đầu ra –
chèn nhiều hàng. Một bảng có thể lưu trữ tối đa 1000 hàng trong một câu lệnh chèn. .
cú pháp
Ví dụ – Xét một học sinh ngồi bàn. .
Đầu ra –

Row_count() trong MySQL là gì?

Mô tả. ROW_COUNT() trả về số hàng được cập nhật, chèn hoặc xóa bởi câu lệnh trước . Điều này giống như số lượng hàng mà máy khách mysql hiển thị và giá trị từ hàm API mysql_affected_rows() C.