Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przenoszenie kolumn w bazie bez podawania typu
Forum PHP.pl > Forum > Bazy danych > MySQL
expert
Witam,

potrzebuję mieć w skrypcie opcję przenoszenia kolumn. Mam taki skrypt:
  1. 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:
  1. SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa'

Jednak gdy wstawię go w nawiasie zamiast zmiennej:
  1. 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
Może trochę nie na temat ale zżera mnie ciekawość: po co? Po co Tobie to przenoszenie kolumn?
expert
Po to, że piszę stronę internetową, która będzie nakładką na bazę danych.
nospor
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
musisz zrobic dynamiczny SQL
czyli jakas procedurka albo skrypt w php

chodzi o to (przybliżony skrypt)

  1. $wartosc = mysql_query(SELECT column_type FROM information_schema.COLUMNS WHERE table_name='table' AND COLUMN_NAME = 'aaa')
  2. $alter = "'ALTER TABLE `table` MODIFY `aaa` ".$wartosc." NOT NULL AFTER `bbb`";


a pozniej robisz execute po $alter

inaczej tego nie zrobisz
expert
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
To teraz znowu zżera mnie ciekawość: a czemu chcesz to tak uparcie zrobić w jednym zapytaniu? Jaki tego sens?
wiiir
wg mnie nie da sie tego zrobic, bo alter nie przyjmuje subquery
expert
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
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
no to zrob sobie procedure mysql i tez bedziesz mial jedna jeszcze krotsza linie kodu

Nie rozumiem dlaczego koniecznie jedna linie kodu chcesz miec smile.gif oszczedność miejsca? Bo chyba ze czytelność kodu smile.gif
expert
Czytelność kodu.
nospor
Ale to nie ma zadnego związku z poprawą czytelności...
mmmmmmm
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
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
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
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
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
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.