Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Kopiowanie rekordów z tabeli A do tabeli B
Forum PHP.pl > Forum > Przedszkole
heronek
Witam, jestem początkującym twórcą baz danych w oparciu o narzędzie Workbench. Mój problem polega na tym iż nie mogę poradzić sobie z zagadnieniem skopiowania rekordów z tabeli A do tabeli B. Czy mógłby mnie ktoś nakierować na dobry trop? Poniżej wklejam dwa script'y ukazujące obydwie tabele:

  1.  
  2. CREATE TABLE IF NOT EXISTS msu_MIASTA
  3. (id_m varchar(5) NOT NULL,
  4. id_w varchar(2) NOT NULL,
  5. nazwa_m varchar(20) NOT NULL,
  6. X decimal(10,2) DEFAULT NULL,
  7. Y decimal(10,2) DEFAULT NULL,
  8. B decimal(8,4) DEFAULT NULL,
  9. L decimal(8,4) DEFAULT NULL,
  10. PRIMARY KEY (id_m,id_w));


  1. CREATE TABLE IF NOT EXISTS wsp_MIASTA
  2. (id_m varchar(5) NOT NULL,
  3. id_w varchar(2) NOT NULL,
  4. X decimal(10,2) DEFAULT NULL,
  5. Y decimal(10,2) DEFAULT NULL,
  6. B decimal(8,4) DEFAULT NULL,
  7. L decimal(8,4) DEFAULT NULL,
  8. PRIMARY KEY (id_m,id_w));


PS: Chcę skopiować rekordy X, Y, B, L z tabeli wsp_MIASTA do tabeli msu_MIASTA.


heronek
A jak ułożyć warunek w oparciu o klucze główne?
viking
Dokładnie tak samo.
heronek
Albo się do końca nie rozumiemy albo ja nie rozumiem. Otóż chcę aby wszystkie wiersze z kolumn B,L,X,Y z tabeli wsp_MIASTA skopiowały się do tych samych kolumn z tabeli msu_MIASTA. Ustawiłem klucz główny by przy kopiowaniu danych nastąpiło przy okazji ich posortowanie. Przy wykorzystaniu poniżej wklejonego scriptu:

  1. INSERT INTO msu_MIASTA (B, L, X, Y)
  2. SELECT B, L, X, Y
  3. FROM wsp_MIASTA;


wyskakuje błąd: Field 'id_m' doesn't have a default value

Hym, niewiele mi to mówi jako że rozpoczynam Swoją przygodę z MySQL.

PS: Nie potrzebuje odsyłania do stron z encyklopediami MySQL z banalnymi przykładami bo potrafię takie sam wyszukać. Na sztukę to można jajka sprzedawać, a nie odpowiadać na posty.
viking
Field 'id_m' doesn't have a default value oznacza że nie wkładasz żadnej wartości do tego pola, a nie ma też żadnej domyślnej. U ciebie id_m i id_w są NOT NULL.
heronek
Domyślnie jest NOT NULL, ale po stworzeniu tychże tabeli zostały one uzupełnione o dane, więc mają wartość, a mimo to nadal wyświetla ten komunikat błędu.
viking
To że wcześniej były zapisane jakieś rekordy z wartością nie ma znaczenia. Podczas operacji INSERT nie mają żadnej wartości a zgodnie z restrykcją kolumny mają być NOT NULL.
heronek
Więc istnieje jakiś prosty sposób na kopiowanie całych kolumn z jednej tabeli do drugiej w sposób uporządkowany na podstawie klucza głównego (w tym przypadku id_m id_w)?
viking
Tak, ten wyżej z uwzględnieniem restrykcji kolumn. Skopiuj też klucze albo zdejmij ograniczenie NOT NULL.
heronek
Niestety nie mam pojęcia jak w tym przypadku ułożyć warunek o klucze główne które nałożyłem po wprowadzeniu danych (id_m, id_w) do obydwu tabel. A przecież nie będę tworzył warunku na podstawie kopiowania do niego wartości każdego z wierszy klucza.
viking
No dobrze, to co ma się znaleźć w nowej tabeli w kolumnach id_m, id_w?
heronek
A więc tak, mają powstać dwie tabele- wsp_MIASTA oraz msu_MIASTA:
  1. CREATE TABLE IF NOT EXISTS wsp_MIASTA
  2. (id_m varchar(5)KEY NOT NULL ,
  3. id_w varchar(2) NOT NULL ,
  4. X decimal(10,2) DEFAULT NULL,
  5. Y decimal(10,2) DEFAULT NULL,
  6. B decimal(8,4) DEFAULT NULL,
  7. L decimal(8,4) DEFAULT NULL);


  1. CREATE TABLE IF NOT EXISTS msu_MIASTA
  2. (id_m varchar(5)KEY NOT NULL ,
  3. id_w varchar(2) NOT NULL,
  4. nazwa_m varchar(20) NOT NULL,
  5. X decimal(10,2) DEFAULT NULL,
  6. Y decimal(10,2) DEFAULT NULL,
  7. B decimal(8,4) DEFAULT NULL,
  8. L decimal(8,4) DEFAULT NULL);


Uzupełniam je o następujące dane:
  1. INSERT INTO wsp_MIASTA (id_w,id_m,B,L)
  2. VALUES
  3. ('06','03032','51.1333','23.5000'),
  4. ('06','63011','51.2500','22.5667'),
  5. ('06','61011','52.0333','23.1333'),
  6. ('06','19011','51.5500','23.5500'),
  7. ('06','01021','52.0755','23.6161'),
  8. ('06','15011','51.7833','22.6167'),
  9. ('06','04011','50.8000','23.9167'),
  10. ('06','05054','50.7167','22.4167'),
  11. ('06','06011','50.9833','23.1833'),
  12. ('06','07011','50.9167','22.2333'),
  13. ('06','08011','51.4667','22.6333'),
  14. ('06','10034','51.2833','22.8667'),
  15. ('06','11011','51.9272','22.3833'),
  16. ('06','12054','51.1500','21.9667'),
  17. ('06','13044','51.6333','22.9000'),
  18. ('06','14011','51.4167','21.9667'),
  19. ('06','16044','51.6333','21.9333'),
  20. ('06','16011','51.5667','21.8333'),
  21. ('06','17011','51.2500','22.6833'),
  22. ('06','17034','51.1342','22.8447');


insert into msu_MIASTA (id_w,id_m,nazwa_m)
values('06','03032','Chelm'),
('06','63011','Lublin'),
('06','61011','Biala Podlaska'),
('06','19011','Wlodawa'),
('06','01021','Terespol'),
('06','15011','Radzyn Podlaski'),
('06','04011','Hrubieszow'),
('06','05054','Janow Lubelski'),
('06','06011','Krasnystaw'),
('06','07011','Krasnik'),
('06','08011','Lubartow'),
('06','10034','Leczna'),
('06','11011','Lukow'),
('06','12054','Opole Lubelskie'),
('06','13044','Parczew'),
('06','14011','Pulawy'),
('06','16044','Ryki'),
('06','16011','Deblin'),
('06','17011','Swidnik'),
('06','17034','Piaski');

Następnie tworzę klucze głowne:
  1. ALTER TABLE msu_MIASTA ADD PRIMARY KEY (id_m, id_w);


  1. ALTER TABLE wsp_MIASTA ADD PRIMARY KEY (id_m, id_w);


Więc mam już tabele z uzupełnionymi poszczególnymi kolumnami. Teraz chciałbym utworzyć skrypt który pozwoli mi skopiowanie wartości (B,L,X,Y) z tebeli wsp_MIASTA do tabeli msu_MIASTA w oparciu o ustalone klucze główne.





viking
Klucz główny dodaje tylko indeks i unikalność. Dopóki nie usuniesz NOT NULL nie będziesz w stanie wstawić tam pustych wartości. Jeśli nie chcesz kopiować kolumn id_m/w t wstaw tam coś losowego. Naprawde nie wiem jak mam ci to lepiej wytłumaczyć. Takie restrykcje sam nakładasz i nie da się ich inaczej złamać bo wtedy bezcelowe były by wszystkie ograniczenia.
heronek
A istnieje taka możliwość byś mi przedstawił jak byś to zrobił?
nospor
Nie znamy twoich zalozen. nie wiemy po grzyba chcesz miec dwie niemalze identyczne tabele - na chwile obecna to nie ma zadnego sensu.
Nie wiemy czemu zakladasz tak dziwne klucze glowne, ktore na dodatek nie chcesz kopiowac z jednej tabeli do drugiej a ktore na chwile obecna wydaja sie, ze powinny byc poprostu skopiowane

ps: odnosze nie odparte wrazenie ze ty z tabeli wsp chcesz wpisac dane do odpowiednich rekordow z msu. Nie wiem czy wiesz, ale INSERT dodaje te rekordy jako nowe do msu a nie updatuje rekordy z msu.
heronek
O tym to wiem. Takie są studia panowie i bezsensowne założenia.
nospor
Ale poki co to ty nam opowiadasz o tych zalozeniach i nadal nic wiemy. Wiec poki co to to problem jest po Twojej stronie a nie po stronie studiow. To nie studia nam nie mowia co sie ma konkretnie dziac tylko ty.
heronek
Przecież wyraźnie napisałem że mam w oparciu o dwie kolumny które są takie same w dwóch tabelach skopiować dane z jednej tabeli do drugiej, przykładowo żeby dane z kolumny X,Y o id=1 kopiowały się do drugiej tabeli o tym samym id, a tak ma być dla wszystkich kolumn. Jak wyglądają tabele to widać na poprzednich moich postach.
nospor
Cytat
Przecież wyraźnie napisałem [.....] przykładowo żeby dane z kolumny X,Y o id=1 kopiowały się do drugiej tabeli o tym samym id, a tak ma być dla wszystkich kolumn
A ja skolei ci wyraznie napisalem:

Cytat
ps: odnosze nie odparte wrazenie ze ty z tabeli wsp chcesz wpisac dane do odpowiednich rekordow z msu. Nie wiem czy wiesz, ale INSERT dodaje te rekordy jako nowe do msu a nie updatuje rekordy z msu.

Na co odpisales:
Cytat
O tym to wiem.

Tak wiec nie, nie wiesz.
Zrozum wkoncu ze ty chcesz zrobic UPDATE a nie INSERT. Nie wierze, ze na studiach kaza ci robic insert gdy proszą o aktualizacje rekordu wiec nie zwalaj prosze swojej niewiedzy na studia bo to tylko i wylacznie twoja wina smile.gif
heronek
Przecież w drugiej tabeli do której mam przerzucić wartości są wartości NULL, więc jak update?
nospor
Tak, w tabeli MSU pola X Y B L sa NULL i to wlasnie te pola masz wypelnic danymi z tabeli WSP. Tak, do tego wlasnie sluzy UPDATE a nie INSERT.
heronek
Udało się, dzięki Panowie za uświadomienie mojej niewiedzy! oneeyedsmiley02.png
nospor
Na przyszlosc opisuj problem porzadnie. Dopiero w jednym z ostatnich postow napisales o co ci dokladnie chodzi tuz po tym jak wstawilem swoje "ps". Wczesniej opisywales caly czas zupelnie co innego.
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.