sql >> Databáze >  >> RDS >> Mysql

Hromadné vkládání tabulek souvisejících s MySQL z bash

Ve vaší otázce jsou uvedeny různé protichůdné požadavky. Tato odpověď se soustředí na její aspekt „zamknout“.

Chcete-li zachovat zámek tabulky pro celou operaci, budete muset udržovat jediné připojení k serveru SQL. Jedním ze způsobů by bylo předat vše jako víceřádkový vícepříkazový vstup do jediného vyvolání klienta příkazového řádku mysql. V podstatě takto:

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

To by fungovalo, pokud můžete generovat všechny požadované příkazy bez kladení otázek z databáze (jako maximální identifikátor), zatímco je zámek zachován.

Abyste mohli kombinovat operace čtení (např. dotaz na maximální hodnotu) a operace zápisu (např. načítání obsahu některých souborů), budete potřebovat obousměrnou komunikaci se serverem. Dosažení tohoto pomocí bash je velmi složité, takže bych to nedoporučoval. I když nemusíte klást otázky, jednosměrné připojení poskytované bash pipe je zdrojem nebezpečí:Pokud se na straně mysql něco pokazí, bash si toho nevšimne a stejně vydá další příkaz. Mohli byste skončit odevzdáním nekonzistentních dat.

Z těchto důvodů bych raději navrhl nějaký skriptovací jazyk, pro který jsou k dispozici vazby mysql, jako jsou možnosti Perl nebo Pyhon, které jste zmínil. Čtení souborů CVS v těchto jazycích je snadné, takže můžete provádět všechny následující činnosti v jediném skriptu:

  1. uzamknout stoly
  2. zahájit transakci
  3. číst vstupní soubory csv
  4. pokládejte otázky jako max. id
  5. upravte vstupní data tak, aby odpovídala rozložení tabulky
  6. vkládání dat do tabulek
  7. pokud nedošlo k žádným chybám, potvrďte transakci



  1. Existuje způsob, jak odstranit řádek z mysql po určité době počítání od času vložení

  2. Oracle - Klonovací tabulka - Struktura, datová omezení a vše

  3. Rozbalovací seznam PHP, z nichž každý je spolehlivý

  4. Jak číst obrázky z databáze MySQL pomocí PHP?