expert
20.02.2013, 18:08:51
Witam,
potrzebuję mieć w skrypcie opcję przenoszenia kolumn. Mam taki skrypt:
ALTER TABLE `table` MODIFY `aaa` decimal(20,2) NOT NULL AFTER `bbb`
Chciałbym jednak w tym zapytaniu wykluczyć potrzebę podawania typu przenoszonej kolumny. Do wykrywania typu kolumny mam taki kod:
SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa'
Jednak gdy wstawię go w nawiasie zamiast zmiennej:
ALTER TABLE `table` MODIFY `aaa` (SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa') NOT NULL AFTER `bbb`
to PhpMyAdmin sypie błędami:
Cytat
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(SELECT column_type FROM information_schema.columns WHERE table_name = `table`' at line 1
O co biega?
nospor
20.02.2013, 18:12:20
Może trochę nie na temat ale zżera mnie ciekawość: po co? Po co Tobie to przenoszenie kolumn?
expert
20.02.2013, 18:15:25
Po to, że piszę stronę internetową, która będzie nakładką na bazę danych.
nospor
20.02.2013, 18:19:10
Znaczy takie PMA....
Dziekuje, ciekawośc zaspokojona.
Zamiast o to:
(SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa')
wkładać w zapytanie z alter table, pobierz wpierw ten tyb jako osobne zapytnie, zapisz do zmiennej, a potem do tego alter table wstaw wartosc tej zmiennej - to chyba dość logiczne i oczywiste
wiiir
20.02.2013, 18:23:22
musisz zrobic dynamiczny SQL
czyli jakas procedurka albo skrypt w php
chodzi o to (przybliżony skrypt)
$wartosc = mysql_query(SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa')
$alter = "'ALTER TABLE `table` MODIFY `aaa` ".$wartosc." NOT NULL AFTER `bbb`";
a pozniej robisz execute po $alter
inaczej tego nie zrobisz
expert
20.02.2013, 18:23:44
Jednak ja bym chciał to osiągnąć w jednym zapytaniu. Chyba, że da ragę ta zmienną zrobić w zapytaniu, czyli @var = ....
Bo tak bym się o to nie pytał.
nospor
20.02.2013, 18:28:27
To teraz znowu zżera mnie ciekawość: a czemu chcesz to tak uparcie zrobić w jednym zapytaniu? Jaki tego sens?
wiiir
20.02.2013, 18:31:30
wg mnie nie da sie tego zrobic, bo alter nie przyjmuje subquery
expert
20.02.2013, 18:34:35
Bo w tedy wstawiam taki kod:
Kod
mysql_query('ALTER TABLE `table` MODIFY `'.$colum1.'` (SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = `'.$colum1.'`) NOT NULL AFTER `'.$colum2.'`')
I w jednej linijce kodu mam całe przenoszenie kolumn, a nie kilku.
nospor, aleś Ty ciekawy ;-)
nospor
20.02.2013, 18:37:12
Programowanie nie polega na tym, by wszystko zrobić w jednej linii... bądź poważny.
Skoro piszesz nakładke na bazę danych to rób to porządnie:
jesli masz modyfikować jaką tabele, to weź najpierw pobierz info o tej tabeli, sprawdź czy w ogole istnieją dane kolumny itp. A robiąc tę podstawową rzecz, masz od razu całe ifno o kolumnie i możesz bez problemu z niego skorzystać
wiiir
20.02.2013, 18:39:09
no to zrob sobie procedure mysql i tez bedziesz mial jedna jeszcze krotsza linie kodu
Nie rozumiem dlaczego koniecznie jedna linie kodu chcesz miec

oszczedność miejsca? Bo chyba ze czytelność kodu
expert
20.02.2013, 18:45:25
Czytelność kodu.
nospor
20.02.2013, 18:55:33
Ale to nie ma zadnego związku z poprawą czytelności...
mmmmmmm
20.02.2013, 18:57:06
Cały problem polega na tym, że jest to nikomu niepotrzebny i zbędny ficzer.
Kolejność kolumn (atrybutów) tabeli NIGDY nie była ważna. Większość porządnym DBMS NIE POZWALA wstawić kolumny w dowolnym miejscu, tylko zawsze na końcu. I jest to działanie prawidłowe.
expert
20.02.2013, 19:06:58
Cytat(nospor @ 20.02.2013, 19:37:12 )

Skoro piszesz nakładke na bazę danych to rób to porządnie:
jesli masz modyfikować jaką tabele, to weź najpierw pobierz info o tej tabeli, sprawdź czy w ogole istnieją dane kolumny itp. A robiąc tę podstawową rzecz, masz od razu całe ifno o kolumnie i możesz bez problemu z niego skorzystać
Akurat takie info pobieram, zwracam kolumny z poustawianymi typami i potem chce to jakoś zapisać, czyli muszę znów pobrać nazwy kolumn, sprawdzić, które się zmieniły w nazwie, których nie ma bo zostały usunięte i które mają pozamieniane kolejności.
Pomyślę, jak to rozwiązać inaczej.
nospor
21.02.2013, 10:59:50
Chyba trochę źle do tego podszedłeś. Spójrz choćby w PMA jak on daje użytkownikowi możliwość edycji tabel czy przesuwania pól. Powinieneś pojść mniej więcej w tym kierunku
expert
21.02.2013, 11:06:14
Mnie nie interesuje czy PMA daje możliwość przesuwania kolumn czy nie.
Robię pewnego rodzaju magazyn i chce dać użytkownikowi opcję zamiany kolumn miejscami. Tyle.
nospor
21.02.2013, 11:37:15
Pokazałem ci poprostu jedynie jak to zrobić na przykładzie PMA.... To czy cię to interesuje czy nie to już Twój problem
expert
21.02.2013, 11:41:05
Ok. Co by nie było, to mojego problemu nie da się rozwiązać w jednym zapytaniu. Temat chyba jest już wyczerpany :-)
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.