Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Kopiowanie kolumny miedzy tabelami
oliver84
post 1.12.2012, 18:29:07
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

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


Witam! Przeszukałem forum i nie znalazłem nic co by mi pomogło w rozwiazaniu problemu. Były przypadki podobne ale nie do końca te same. W związku z tym, że jestem zielony w sql chcialem zapytać czy jest mozliwosc skopiowania danych z tabeli A kolumny iduser, login do tabeli B do kolumny user_id, username. Obie tablice sa w tej samej bazie.

tablica A wyglada tak:
| iduser | login |
_______________
| 3 | mustafa|
| 4 | nurek |

tablica B wyglada tak:

| user_id | username |
_____________________
| | |
| | |


tablica B ma wygladac tak

| user_id | username |
_____________________
| 3 | mustafa |
| 4 | nurek |
Go to the top of the page
+Quote Post
mortus
post 1.12.2012, 19:03:44
Post #2





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

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


  1. INSERT INTO `B` (`user_id`, `username`) SELECT (`iduser`, `login`) FROM `A`

Można też użyć ALTER TABLE i zmienić nazwy obu kolumn, ale to tylko wtedy, gdy stara tabela nie będzie już wykorzystywana.
Go to the top of the page
+Quote Post
oliver84
post 1.12.2012, 19:34:30
Post #3





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

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


Jak chce skopiowac dwie kolumny to wywala blad: #1241 - Operand should contain 1 column(s)
Składnia: INSERT INTO `phpbb_users` (`user_id`, `username`) SELECT (`iduser`, `login`) FROM `league_users`
jedna kopiuje bez problemu
w kazdej z tabel jeszcze jest pare kolumn ale chce przeniesc tylko dwie

Ten post edytował oliver84 1.12.2012, 19:39:01
Go to the top of the page
+Quote Post
mortus
post 1.12.2012, 20:04:06
Post #4





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

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


No tak, bo źle zapisałem zapytanie, nie wiem po co mi te nawiasy w SELECT, powinno być:
  1. INSERT INTO `B` (`user_id`, `username`) SELECT `iduser`, `login` FROM `A`


Ten post edytował mortus 1.12.2012, 20:04:29
Go to the top of the page
+Quote Post
oliver84
post 1.12.2012, 22:22:48
Post #5





Grupa: Zarejestrowani
Postów: 6
Pomógł: 0
Dołączył: 27.07.2012

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


dzieki działa smile.gif akopiowalo wszystko jak ta lala
Go to the top of the page
+Quote Post
SUICIDE
post 1.03.2016, 21:34:05
Post #6





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 31.10.2012
Skąd: Gorzów Wlkp

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


Przyłącze się do tematu


Z Tabeli : sb_admins
Do kolumny: data
aid = autoinkrementacja


Do Tabeli: sb_admins_servers_groups
Do kolumny: datax
admin_id: ten sam numer co w 'aid' kolumny sb_admins

Chcę skopiować daty do drugiej tabeli (sb_admins_servers_group) , kolumny (datax)
Oczywiście dla danego numeru id które mają różne nazwy kolumn.

Napisałem takie zapytanie i zamieniałem frazę Where na aid='admin_id' lub admin_id='aid' Ale niestety dat mi nie przeniosło.

  1. INSERT INTO `sb_admins_servers_groups` (`datax`) SELECT (`data`) FROM sb_admins WHERE aid='admin_id'



Wzorowałem się na przykładzie z tego tematu.
Go to the top of the page
+Quote Post
mortus
post 2.03.2016, 10:03:25
Post #7





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

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


Witam.

Kolumny data i datax w obu tabelach muszą być tego samego typu, a jeśli nie są, to trzeba wynik SELECT-a przekształcić za pomocą odpowiednich funkcji, np.
  1. ... SELECT DATE(`data`) FROM `sb_admins` ...

Funkcje daty i czasu można znaleźć w dokumentacji.
Finalnie zapytanie powinno wyglądać tak:
  1. INSERT INTO `sb_admins_servers_groups` (`datax`) SELECT `data` FROM `sb_admins` WHERE `sb_admins_servers_groups`.`admin_id` = `sb_admins`.`aid`;

Jeśli na kolumnę `data` lub `datax` nałożony jest index, to należy mieć to na względzie i użyć opcji ON DUPLICATE KEY UPDATE. Więcej informacji można znaleźć w dokumentacji.

Pozdrawiam

Ten post edytował mortus 2.03.2016, 10:03:58
Go to the top of the page
+Quote Post
SUICIDE
post 2.03.2016, 15:42:31
Post #8





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 31.10.2012
Skąd: Gorzów Wlkp

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


Po wykonaniu Twojego zapytania jest komunikat
#1054 - Unknown column 'sb_admins_servers_groups.admin_id' in 'where clause'

co do kolumn obie mają typ:timestamp z formatem 0000-00-00 00:00:00 bez atrybutów "on update......."

Ten post edytował SUICIDE 2.03.2016, 15:44:07
Go to the top of the page
+Quote Post
mortus
post 2.03.2016, 21:08:26
Post #9





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

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


I słusznie, bo zapytanie nie powinno działać tak, jak chcemy. W ogóle klauzula WHERE nie jest tutaj w tej formie potrzebna ponieważ jest to INSERT, dla którego SELECT jedynie wybiera odpowiednie wartości (VALUES). Zapytanie powinno wyglądać tak:
  1. INSERT INTO `sb_admins_servers_groups` (`admin_id`, `datax`) SELECT `aid`, `data` FROM `sb_admins` ON DUPLICATE KEY UPDATE `datax` = VALUES(`datax`);

Można również użyć zwykłego UPDATE-a i SELECTA-a jako podzapytania:
  1. UPDATE `sb_admins_servers_groups` SET `datax` = (SELECT `data` FROM `sb_admins` WHERE `sb_admins`.`aid` = `sb_admins_servers_groups`.`admin_id`);

Alternatywą dla INSERT INTO SELECT jest REPLACE:
  1. REPLACE INTO `sb_admins_servers_groups` (`admin_id`, `datax`) SELECT `aid`, `data` FROM `sb_admins`;

Zarówno INSERT INTO ... SELECT, jak i REPLACE INTO ... SELECT muszą do porównania użyć unikalnego klucza i wstawiają rekordy, dla których ten unikalny klucz nie istnieje.
Go to the top of the page
+Quote Post
SUICIDE
post 2.03.2016, 21:31:45
Post #10





Grupa: Zarejestrowani
Postów: 43
Pomógł: 0
Dołączył: 31.10.2012
Skąd: Gorzów Wlkp

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


Dzięki wielkie.
Uratowałeś mnie przed Syzyfową pracą. ;P
Już kilka rekordów manualnie zaczynałem przepisywać.
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: 20.04.2024 - 01:14