Jak połączyć dwie bazy danych o takiej samej strukturze?

0

Mam 2 identyczne bazy danych MySql które muszę połączyć w jedną.
Dwie tabelki Produkt oraz Rodzaj.
Tak to wygląda:

CREATE TABLE Produkt (
    id int,
    klient int,
    cena varchar(255),
    rodzaj int
);

CREATE TABLE Rodzaj (
    id int,
    nazwa varchar(255)
);

INSERT INTO Produkt (id, klient, cena, rodzaj) VALUES (0, 123, '123', 3);
INSERT INTO Produkt (id, klient, cena, rodzaj) VALUES (1, 221, '124', 2);
INSERT INTO Produkt (id, klient, cena, rodzaj) VALUES (2, 321, '125', 1);

INSERT INTO Rodzaj (id, nazwa) VALUES (0, 'nazwa 1');
INSERT INTO Rodzaj (id, nazwa) VALUES (1, 'nazwa 2');
INSERT INTO Rodzaj (id, nazwa) VALUES (2, 'nazwa 3');

Zarówno w tabelce produkt jak i rodzaj na polu id jest autoinkrementacja
Kolumna rodzaj z tabeli Produkt powiązana jest z id z tabeli Rodzaj.

Problem mam z przeniesieniem tabelki Produkt z jednej bazy do drugiej, a dokładniej z kolumną rodzaj.

Bo kiedy wykonam takie zapytanie na docelowej bazie:

INSERT INTO Produkt (klient, cena, rodzaj) VALUES (0, 123, '123', 3);
INSERT INTO Produkt (klient, cena, rodzaj) VALUES (1, 221, '124', 2);
INSERT INTO Produkt (klient, cena, rodzaj) VALUES (2, 321, '125', 1);

INSERT INTO Rodzaj (nazwa) VALUES (0, 'nazwa 1');
INSERT INTO Rodzaj (nazwa) VALUES (1, 'nazwa 2');
INSERT INTO Rodzaj (nazwa) VALUES (2, 'nazwa 3');

rekordy się przeniosą tylko będą miały nowe id a co za tym idzie będzie błąd w kolumnie rodzaj bo będzie się odnosić do starego id tabeli Rodzaj

Ma ktoś może pomysł jak to sensownie można przenieść takie dane?

3

Przenosisz rodzaj, pobierasz jego nowy id, przenosisz produkt wstawiając nowy id.
Z czym konkretnie masz problem?

0

Tylko jak to zrobić? :)
Mam dwie bazy, dostęp do obu przez phpmyadmin.
Robię Export tabelki Rodzaj i mam plik z kilkoma tysiącami takich wierszy:

INSERT INTO Rodzaj (id, nazwa) VALUES (0, 'nazwa 1');
...

to mogę wrzucić do docelowej tabelki, dodadzą się rekordy i będą miały nowe id

Teraz jak przenieść tabelkę produkt (30k rekordów) aby w docelowej bazie miały kolumnę rodzaj z nowy id?

0

Można to robić na różne sposoby. Albo obydwa importy robisz do tabel tymczasowych i potem kopiujesz z tabeli do tabeli wiązać po nazwach rodzajów,
albo podczas generowania eksportu budujesz zapytanie INSERT pobierające nowe id z bazy szukając po nazwie rodzaju. Coś w ten deseń:

INSERT INTO PRODUKT ( klient, cena, rodzaj )
SELECT 221,'124',ID FROM Rodzaj WHERE NAZWA = 'nazwa 3'

Tak, czy inaczej, nie wyklikasz sobie tego w phpmyadmin, tylko musisz napisać.
Oczywiście ręcznie insertów nie pisz, tylko zbuduj je sobie odpowiednim Selectem.

0

Podoba mi się rozwiązanie które zaproponowałeś ale prawdę mówiąc nie wiem jak to zrobić, chodzi o to:

"Oczywiście ręcznie insertów nie pisz, tylko zbuduj je sobie odpowiednim Selectem."

Czyli jest możliwość wygenerowania takich insertów automatycznie?

INSERT INTO Produkt (klient, cena, rodzaj) VALUES (123, '123', SELECT id FROM RODZAJ WHERE nazwa = 'nazwa 1');
INSERT INTO Produkt (klient, cena, rodzaj) VALUES (221, '124', SELECT id FROM RODZAJ WHERE nazwa = 'nazwa 2');
INSERT INTO Produkt (klient, cena, rodzaj) VALUES (123, '123', SELECT id FROM RODZAJ WHERE nazwa = 'nazwa 3');

tak jak pisałem wcześniej używam phpmyadmin tam mogę zrobić dump całej tabelki ale nie wiem jak zrobić aby w miejsce rodzaj pojawił się select.

to by rozwiązało problem, bo wtedy w nowej bazie importuje wszystkie rekordy z tabeli RODZAJ a potem dodaje powyższe inserty i wiąże z nowy id po nazwie

0

Nie wygenerujesz tego klikając w phpMyAdmin, ale możesz napisać sobie SELECTA, który zwróci Ci zestaw Insertów.
Zacznijmy od podstawowego pytania - czy znasz cokolwiek SQL?

Na początek napisz zapytanie, które zwróci Ci trzy kolumny:
Produkt.klient, Produkt.cena, Roczaj.nazwa

Musisz do tego użyć JOINa.

A jak już będziesz to miał, przerób zapytanie tak, żeby zamiast trzech kolumn zwracało INSERTa. Tutaj z pomocą przyjdzie tzw. konkatenacja, czyli łączenie łańcuchów znakowych.

4

Ja zacząłbym od tego, zeby doprowadzić do sytuacji, ze 2 bazy masz na tym samym serwerze, wtedy możesz przewalać dane zapytaniami bez generowania insertów, czyli przekopiowanie z jednej bazy do drugiej:

insert into `nazwabazydocelowej`.`Produkt` (klient, cena, rodzaj)
select klient, cena, rodzaj from  `nazwabazyzrodlowej`.`Produkt`

Co do zmiany id w tabeli rodzaj, to zrobiłbym tak:

  1. W bazie docelowej dodał kolumnę oldid w tabeli rodzaj
  2. Przy przegrywaniu tabeli rodzaj do oldid wstawił kolumnę id z tabeli źródłowej
  3. jednym updatem zaktualizował rodzaj w tabeli produkt przy użyciu joinów
  4. usunął kolumnę oldid

To zadziała, jeżeli struktura jest taka jak podałeś w przypadku jeżeli masz zdefiniowany FK na rodzaju to wtedy musisz użyć foreign_key_checks

0

@Panczo:

Uprzedziłeś mnie z tym "old id", to jest profesjonalna sekwencja.

Nie wiem na ile pomocne, jeśli kolega jest na etapie "mam w myphpadmin"

0

@AnyKtokolwiek: jeśli już tak bardzo chcesz błysnąć przed kolegami pokazując jaki ktoś jest słaby cytując jego wypowiedzi to chociaż kopiuj to co ktoś napisał, bo ja nic takiego jak "mam w myphpadmin" nie napisałem ;) Co to w ogóle jest myphpadmin :D

Użyłem tabelek tymczasowych, dodałem oldid i przeniosłem dane jak napisał @Panczo, chyba to najrozsądniejsze podejście.
Dzięki za odpowiedzi

1 użytkowników online, w tym zalogowanych: 0, gości: 1