Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Dua sisipan kueri dengan bidang tertaut

Beberapa penyederhanaan dimungkinkan. Pertama-tama Anda harus menyertakan semua perintah Anda di dalam transaksi karena ini adalah kasus klasik di mana catatan yang dimasukkan berada dalam hubungan yang ketat dan tidak masuk akal untuk memiliki beberapa kumpulan catatan yang selesai sebagian.

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

Sekarang, Anda dapat mengubah insert question sql untuk menambahkan pernyataan kedua yang mengembalikan id terakhir yang dimasukkan

 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());

    ..

 }

Perhatikan bagaimana, pada konstruktor MySqlCommand, diteruskan referensi ke transaksi saat ini. Ini diperlukan untuk bekerja dengan koneksi yang membuka transaksi.

Hal-hal yang sedikit lebih kompleks untuk bagian kedua. Trik yang sama untuk menambahkan pernyataan sql kedua dapat diterapkan juga pada loop yang menyisipkan jawaban, tetapi Anda perlu melakukan loop mundur jika pertanyaan pertama adalah pertanyaan yang benar

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());
    }
    ....
}

Sekarang Anda dapat menjalankan perintah terakhir yang memperbarui pertanyaan dengan lastAnswerID

(Catatan terakhir, saya kira bidang question_id dan answer_id bertipe numerik, bukan varchar, ini mengharuskan parameter untuk bidang ini adalah Int32 bukan 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. cara memublikasikan penginstal aplikasi jendela c#

  2. Statistik Dengan Tcl Dan Mysql

  3. Bagaimana cara mirror database MySQL lokal ke MySQL online (realtime)?

  4. MySql:Pilih item yang memiliki semua nilai

  5. Butuh bantuan dalam membangun kueri MYSQL untuk menghitung dua konten dari satu baris/tabel