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

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 = ? && product_price 

Chủ Đề