Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Przenoszenie kolumn w bazie bez podawania typu
expert
post
Post #1





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 18)
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Może trochę nie na temat ale zżera mnie ciekawość: po co? Po co Tobie to przenoszenie kolumn?
Go to the top of the page
+Quote Post
expert
post
Post #3





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


Po to, że piszę stronę internetową, która będzie nakładką na bazę danych.
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
wiiir
post
Post #5





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


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
Go to the top of the page
+Quote Post
expert
post
Post #6





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


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ł.
Go to the top of the page
+Quote Post
nospor
post
Post #7





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




To teraz znowu zżera mnie ciekawość: a czemu chcesz to tak uparcie zrobić w jednym zapytaniu? Jaki tego sens?
Go to the top of the page
+Quote Post
wiiir
post
Post #8





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


wg mnie nie da sie tego zrobic, bo alter nie przyjmuje subquery
Go to the top of the page
+Quote Post
expert
post
Post #9





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


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 ;-)
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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ć
Go to the top of the page
+Quote Post
wiiir
post
Post #11





Grupa: Zarejestrowani
Postów: 260
Pomógł: 34
Dołączył: 22.02.2010

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


no to zrob sobie procedure mysql i tez bedziesz mial jedna jeszcze krotsza linie kodu

Nie rozumiem dlaczego koniecznie jedna linie kodu chcesz miec (IMG:style_emoticons/default/smile.gif) oszczedność miejsca? Bo chyba ze czytelność kodu (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
expert
post
Post #12





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


Czytelność kodu.
Go to the top of the page
+Quote Post
nospor
post
Post #13





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Ale to nie ma zadnego związku z poprawą czytelności...
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #14





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


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.
Go to the top of the page
+Quote Post
expert
post
Post #15





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #16





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




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
Go to the top of the page
+Quote Post
expert
post
Post #17





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


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.
Go to the top of the page
+Quote Post
nospor
post
Post #18





Grupa: Moderatorzy
Postów: 36 559
Pomógł: 6315
Dołączył: 27.12.2004




Pokazałem ci poprostu jedynie jak to zrobić na przykładzie PMA.... To czy cię to interesuje czy nie to już Twój problem
Go to the top of the page
+Quote Post
expert
post
Post #19





Grupa: Zarejestrowani
Postów: 211
Pomógł: 4
Dołączył: 29.10.2008

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


Ok. Co by nie było, to mojego problemu nie da się rozwiązać w jednym zapytaniu. Temat chyba jest już wyczerpany :-)
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 11:19