Prawie NIGDY nie powinieneś polegać na numerze kolumny w tabeli w jakimkolwiek kodzie (nawet jeśli teoretycznie MOŻESZ to zrobić technicznie).
Powodów jest wiele, jednym z najważniejszych jest to, że ktoś zawsze może ZMIENIĆ tabelę i wstawić kolumnę na początku/środku, całkowicie łamiąc kod.
Drugim powodem jest to, że pozycje kolumn — nawet jeśli założysz, że tabela nigdy się nie zmienia — sprawiają, że jest to absolutnie NIECZYTELNE, a zatem niemożliwe do utrzymania kodu. Czy pamiętasz, że kolumna 13 była „last_name_3” za 2 lata?
Pamiętaj, że jeśli Twój problem polega na tym, że na przykład masz coś takiego jak SELECT fn11, fn12, fn13, ... fn32
w kodzie i czujesz, że przeliterowanie fn11..fn32 jest przeciąganiem, nie tylko masz 100% racji, ale absolutnie powinieneś usunąć to przeciągnięcie za pomocą idiomów Perla, w następujący sposób:"SELECT " . join(", ", map { "fn$_" } (11..32));
Powiedziawszy to, jeśli chcesz wiedzieć, jak to zrobić TEORETYCZNIE, jako ćwiczenie „fajnej sztuczki technologicznej”, nie wiem, jak zrobić to ogólnie przez DBI, ale zwykle możesz to zrobić w bazie danych- konkretny sposób.
W tym celu należy pamiętać, że:
-
Prawie WSZYSTKIE bazy danych tworzą tabele za pomocą pewnego rodzaju instrukcji „CREATE TABLE”, która przyjmuje uporządkowaną listę kolumn (większość relacyjnych baz danych faktycznie fizycznie przechowuje wartości w wierszu w tej kolejności, więc jest to ważne - nawet jeśli teoretyczny rachunek relacyjny traktuje kolumny jako kolejność- mniej, jak powiedział Marcog).
-
Prawie WSZYSTKIE bazy danych zawierają specjalną tabelę, która zawiera listę tabel zawierających które kolumny (
syscolumns
w Sybase,INFORMATION_SCHEMA.COLUMNS
w MySQL), a ta tabela zawiera numeryczny identyfikator kolumny, który jest używany do ich uporządkowania tak samo, jak do zamówienia "utwórz"; a nawet specjalne pole „zamówienie” (np.ORDINAL_POSITION
wartość w MySQL).Możesz więc - z wyprzedzeniem - wyszukać uporządkowaną listę kolumn dla żądanej tabeli i ich kolejność. Aby wyszukać MySQL,
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. Przechowuj dane na liście @columns (lub, jeśli masz wiele tabel, hash tablic, %columns, gdzie nazwa tabeli jest kluczem).Następnie, tworząc zapytanie, po prostu mówisz
"select $columns{table1}->[11],$columns{table1}->[13], ...."
Należy pamiętać, że rzeczywista SQL wysyłany do serwera będzie zawierał nazwy kolumn, ALE nie będziesz ich kodować na stałe w dowolnym miejscu kodu.