Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Skopiowanie danych do innej tabeli
Forum PHP.pl > Forum > Przedszkole
starter91php
Witam, mam jedna "stara" tabele (ok 5000 rekordów), która ma pole 'opis'. Ten opis powiela się często w tej tabeli, np rekordy 1-3 mają ten sam opis, 4-15 inny, 15-34 inny itd.
Utworzyłem sobie nową tabelę descriptions (id int not null auto_increment, opis text). Chciałbym sobie skopiować opisy ze starej tabeli bez powielania ich do nowej tabeli.
Czyli opis reprezentujący rekordy 1-3 w starej tabeli będzie miał swój jeden odpowiadający rekord w nowej tabeli, ten. który reprezentuje 4-15 rekordy także będzie miał swój rekord w nowej tabeli itd. aż do wyczerpania unikalnych opisów ze starej tabeli.

Jak to zrobić automatycznie?
poli25
Utwórz sobie najpierw widok np:

create view stare_dane
as select distinct opis from stara_tabela

a potem utworz sobie skrypt kopiujacy z widoku do nowej_tabeli


zmien swoje dane (nazwy tabel bazy itd...)

  1. <?php
  2.  
  3. $connection=mysql_connect("localhost","root","root") or die("Nie mozna polaczyc z serwerem");
  4.  
  5. $db_mysql=mysql_select_db("baza")
  6. or die("Nie mozna polaczyc z baza danych");
  7.  
  8. $query="select distinct opis from stara_tabela";
  9.  
  10. $wynik=mysql_query($query);
  11.  
  12. $ile=0;
  13. while($row=mysql_fetch_array($wynik))
  14.  
  15. {
  16. $text=$row[0];
  17.  
  18. $check=mysql_query("select count(*) from nowa_tabela where opis='$text'");
  19. $check_num_rows=mysql_num_rows($check);
  20.  
  21. if($check_num_rows==0)
  22.  
  23. {
  24.  
  25. $insert=mysql_query("insert into nowa_tabela (text)
  26. values('$text')") or die("Blad przy dodawaniu pozycji do bazy");
  27.  
  28. $ile++;
  29. }
  30. else
  31. {
  32. echo "masz ju ten opis w bazie";
  33. }
  34.  
  35. }
  36. if($ile>0)
  37. echo "<font color=green>Wprowadzono $ile wierszy<br></font>";
  38. else
  39. echo "<font color=red>Nie dodano zadnych wierszy do bazy<br></font>";
  40.  
  41. ?>


p.s. kiedys mi to kopiowalo wink.gif
starter91php
Wygląda okej - dzięki!
Nie ma jakiegoś sposobu, żeby to zrobić po prostu komendami SQLa w terminalu? wink.gif
mortus
Cytat(starter91php @ 29.03.2012, 13:29:45 ) *
  1. INSERT INTO nowa_tabela ('opis') SELECT * FROM stare_dane;


Nie działa, wiesz moze dlaczego?

opis to nazwa kolumny, zatem powinna być objęta gravisami `, jeśli już. Dodatkowo ze starej tabeli trzeba wybrać dokładnie tyle kolumn, ile wstawiasz do nowej tabeli, czyli:
  1. INSERT INTO `nowa_tabela` (`opis`) SELECT `opis` FROM `stare_dane` GROUP BY `opis`
.
starter91php
Skopiowałem, dzięki : )


aaaaale...

mam mały błąd kiedy chce porównać te rekordy, związany z charsetami:

  1. Error Number: 1267
  2. Illegal mix of collations (latin1_swedish_ci,IMPLICIT) AND (utf8_general_ci,COERCIBLE) FOR operation '='
  3. SELECT * FROM (`nowa_tabela`) WHERE `opis` = 'Siatkówka Wrocław'


Chcę wyczytać ID opisu z nowej tabeli (wcześniej skopiowałem do niej wszystkie opisy ze starej), przyrównując opis ze starej tabeli. Przy porównaniu w klauzuli WHERE pojawią się powyższy błąd.

Próbowałem zmienić charsety tabel tymi komendami.

  1. ALTER TABLE nowa_tabela charset=latin1;
  2. ALTER TABLE stara_tabela charset=latin1;




Ale to nic nie pmogło. Jak to rozwiązac?
mortus
Tabele powinny mieć to samo kodowanie jeszcze przed skopiowaniem danych, w przeciwnym wypadku trzeba by skorzystać z MySQL-owej funkcji CONVERT lub CAST:
  1. INSERT INTO `nowa_tabela` (`opis`) SELECT CAST(`opis` AS varchar CHARACTER SET utf8) COLLATE utf8_general_ci FROM `stare_dane` GROUP BY `opis`


Cytat(starter91php @ 29.03.2012, 14:54:51 ) *
Chcę wyczytać ID opisu z nowej tabeli (wcześniej skopiowałem do niej wszystkie opisy ze starej), przyrównując opis ze starej tabeli. Przy porównaniu w klauzuli WHERE pojawią się powyższy błąd.

Ale przecież to jest bez sensu, bo w starej tabeli masz wiele id odpowiadających jednemu opisowi. No chyba, że Cię nie rozumiem, a jeśli tak, to wyjaśnij dokładniej.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.