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

Penyisipan massal tabel terkait MySQL dari bash

Ada berbagai persyaratan yang saling bertentangan yang diungkapkan dalam pertanyaan Anda. Jawaban ini berkonsentrasi pada aspek "keep lock".

Untuk mempertahankan kunci tabel untuk seluruh operasi, Anda harus mempertahankan satu koneksi ke server sql. Salah satu cara akan melewati semuanya sebagai input multi-perintah multi-baris ke satu permintaan klien baris perintah mysql. Pada dasarnya seperti ini:

{ echo "LOCK TABLES Table1 WRITE"
  for i in "${infiles[@]}"; do
    echo "LOAD DATA LOCAL INFILE '${i}'"
  done
} | mysql

Itu akan berhasil selama Anda dapat menghasilkan semua pernyataan yang diperlukan tanpa mengajukan pertanyaan dari database (seperti pengenal maksimal) saat kunci disimpan.

Untuk menggabungkan operasi baca (seperti meminta nilai maksimal) dan operasi tulis (seperti memuat konten beberapa file), Anda memerlukan komunikasi dua arah dengan server. Mencapai ini melalui bash sangat rumit, jadi saya sarankan untuk tidak melakukannya. Bahkan jika Anda tidak perlu mengajukan pertanyaan, koneksi searah yang disediakan oleh pipa bash adalah sumber bahaya:Jika ada yang tidak beres di sisi mysql, bash tidak akan menyadarinya dan akan tetap mengeluarkan perintah berikutnya. Anda mungkin berakhir dengan melakukan data yang tidak konsisten.

Untuk alasan ini, saya lebih suka menyarankan beberapa bahasa skrip yang menyediakan binding mysql, seperti opsi Perl atau Pyhon yang Anda sebutkan. Membaca file CVS dalam bahasa tersebut sangatlah mudah, jadi Anda dapat melakukan semua hal berikut dalam satu skrip:

  1. mengunci meja
  2. mulai transaksi
  3. membaca file csv masukan
  4. ajukan pertanyaan seperti max id
  5. menyesuaikan data input agar sesuai dengan tata letak tabel
  6. menyisipkan data ke dalam tabel
  7. jika tidak terjadi kesalahan, lakukan transaksi



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tidak dapat memuat zona waktu?

  2. MySQL group_concat dengan pilih di dalam pilih

  3. Pilih kolom tertentu dari baris tertentu menggunakan mysql_* API lama

  4. MySQL PDO disiapkan lebih cepat dari kueri? Itulah yang ditunjukkan oleh tes sederhana ini

  5. MySQLdb Python menyisipkan %d dan %s