Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL]Skopiowanie danych do innej tabeli
starter91php
post 29.03.2012, 11:54:55
Post #1





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
poli25
post 29.03.2012, 12:05:52
Post #2





Grupa: Zarejestrowani
Postów: 239
Pomógł: 20
Dołączył: 19.02.2010

Ostrzeżenie: (0%)
-----


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

Ten post edytował poli25 29.03.2012, 12:29:13
Go to the top of the page
+Quote Post
starter91php
post 29.03.2012, 12:32:48
Post #3





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


Wygląda okej - dzięki!
Nie ma jakiegoś sposobu, żeby to zrobić po prostu komendami SQLa w terminalu? wink.gif
Go to the top of the page
+Quote Post
mortus
post 29.03.2012, 12:34:13
Post #4





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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`
.
Go to the top of the page
+Quote Post
starter91php
post 29.03.2012, 13:54:51
Post #5





Grupa: Zarejestrowani
Postów: 75
Pomógł: 0
Dołączył: 6.05.2009

Ostrzeżenie: (0%)
-----


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?

Ten post edytował starter91php 29.03.2012, 13:55:40
Go to the top of the page
+Quote Post
mortus
post 29.03.2012, 20:32:19
Post #6





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 8.07.2025 - 02:00