Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Hai truy vấn chèn với các trường được liên kết

Một số đơn giản hóa là có thể. Trước hết, bạn cần phải đặt tất cả các lệnh của mình bên trong một giao dịch bởi vì đây là trường hợp cổ điển mà các bản ghi được chèn vào có mối quan hệ chặt chẽ và không có ý nghĩa gì khi có một số tập hợp các bản ghi đã hoàn thành một phần.

using(MySqlConnection conn = new MySqlConnection(connStr))
{
    conn.Open();
    using(MySqlTransaction tr = conn.BeginTransaction())
    {
        ...
        // MySqlCommand code  goes here
        ...
        tr.Commit();
   }
}

Bây giờ, bạn có thể thay đổi câu hỏi chèn sql của mình để thêm câu lệnh thứ hai trả về id cuối cùng được chèn vào

 string queryUpdateQuestions = @"INSERT INTO questions (.....);
                                 SELECT LAST_INSERT_ID()";

 using(MySqlCommand cmdUpdateQuestions = new MySqlCommand(queryUpdateQuestions, conn, tr))
 {
    // build the parameters for the question record
    ......

    // Instead of ExecuteNonQuery, run ExecuteScalar to get back the result of the last SELECT
    int lastQuestionID = Convert.ToInt32(cmdUpdateQuestions.ExecuteScalar());

    ..

 }

Lưu ý rằng tại phương thức khởi tạo MySqlCommand, được chuyển tham chiếu đến giao dịch hiện tại như thế nào. Điều này là bắt buộc để hoạt động với kết nối đã mở giao dịch.

Mọi thứ phức tạp hơn một chút cho phần thứ hai. Thủ thuật tương tự để thêm câu lệnh sql thứ hai cũng có thể được áp dụng cho vòng lặp chèn câu trả lời, nhưng bạn cần lặp lại nếu câu hỏi đầu tiên là câu đúng

string queryUpdateAnswers = @"INSERT INTO answers (question_id, answer) 
                             VALUES (@question_id, @answer);
                             SELECT LAST_INSERT_ID()";

using(MySqlCommand cmdUpdateAnswers = new MySqlCommand(queryUpdateAnswers, conn, tr))
{
    // next move the loop inside the using and prepare the parameter before looping to  
    // to avoid unnecessary rebuild of the parameters and the command
    cmdUpdateAnswers.Parameters.Add("@answer", MySqlDbType.VarChar);
    cmdUpdateAnswers.Parameters.Add("@question_id", MySqlDbType.Int32);

    int lastAnswerID = 0;  
    // Loop backward so the last answer inserted is the 'correct' one and we could get its ID
    for (int b=a; b >= 1; b--)
    {
         cmdUpdateAnswers.Parameters["@answer"].Value = ((TextBox)this.FindControl("txtAnswer" + b)).Text;
         cmdUpdateAnswers.Parameters["@question_id"].Value = lastQuestionID;
         lastAnswerID = Convert.ToInt32(cmdUpdateAnswers.ExecuteScalar());
    }
    ....
}

Bây giờ bạn có thể chạy lệnh cuối cùng cập nhật câu hỏi với lastAnswerID

(Lưu ý cuối cùng, tôi cho rằng các trường question_id và answer_id thuộc kiểu số, không phải varchar, điều này yêu cầu các tham số cho các trường này phải là Int32 không phải là varchar)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Vấn đề về giá trị mặc định của MySQL

  2. Docker:Vùng chứa Drupal được liên kết với vùng chứa mysql không thể kết nối với mysql trong quá trình cài đặt Drupal

  3. Không thể tạo bảng - LỖI 1064 (42000):Bạn có lỗi trong cú pháp SQL của mình

  4. Các sự kiện được hẹn giờ với php / MySQL

  5. Cần biết Lớp của một mảng Byte được lưu trong Cơ sở dữ liệu MySQL