Wpis z mikrobloga

W jaki sposób importować dane z CSV do wielu relacyjnych tabel?
Załóżmy że mam plik CSV z kolumnami "nazwisko", "miasto".
Naturalnie mam w bazie dwie tabele, jedną z klientami - nazwisko oraz miasto_id, a druga tabela to wiadomo, po prostu id i nazwa miasta.
Jest jakieś narzędzie albo ogólnie przyjęty sposób konwersji takich danych? Zarówno dla baz pustych, jak i tych z danymi.

Jedyne co mi przychodzi na myśl to co wiersz wykonywanie SELECTa w celu znalezienia ID lub INSERT, ale to masakryczna wydajność.

#bazydanych #programowanie #php #mysql
  • 7
  • Odpowiedz
najprościej by chyba było jakbyś zrobił tabele "tymczasową" do której wczytujesz dane z pliku csv, a następnie z tymczasowej miasta do tabeli z miastami(tylko distinctem żeby się nie powtarzały), później nazwiska z tymczasowej do klientów z jednoczesnym zaczytaniem id miasta na podstawie porównania zawartości tabeli tymczasowej z docelowej z miastami

w przypadku ms sqla mozna by to zrobić prostym ssisem, który powinien się dość szybko przetworzyć i dodać do joba, który by
  • Odpowiedz
@aso824: ja to robie fgetcsv i dla każdego wiersza INSERT IGNORE (...) - ale akurat job się robi raz na miesiąc i o wydajność nie muszę się martwić
  • Odpowiedz
@aso824: Lista miast będzie ograniczona? Jeśli tak, to zasysasz całość i przy imporcie sprawdzasz czy masz w tablicy: jest? masz od razu id, nie ma? dodajesz do bazy i do tablicy doklejasz miasto i mysql_insert_id(). Jeśli jednak wielkość danych przekracza granice rozsądku, to jedziesz ajaxem przez emacs: zasysasz 100 linijek z csv zaczynając od miejsca wskazanego przez offset (fseek), dodajesz/pobierasz miasta, dodajesz nazwiska z miastami, wyciągasz miejsce w pliku przy
  • Odpowiedz
@xddxdxdd: @plushy: hm, a sposób dający się zautomatyzować, jakiś ogólny algorytm? Bo otagowałem też #php, chcę dać w panelu możliwość importu danych które mają lecieć do wielu tabel
@januzi: niegłupie, tylko cholera, na każdy wiersz przypada N*kolumny z kluczami obcymi zapytań. Czyli jak tabela ma 3 kolumny posiadające klucze obce, to muszę zawołać aż 3 razy select na każdy wiersz. Wolne ( ͡° ʖ̯ ͡°
  • Odpowiedz