Вы почти НИКОГДА не должны полагаться на номер столбца в таблице в любом своем коде (даже если теоретически вы МОЖЕТЕ делать это технически).
Есть много причин, одна из самых важных состоит в том, что кто-то всегда может ИЗМЕНИТЬ таблицу и вставить столбец в начале / середине, полностью нарушая ваш код.
Вторая причина заключается в том, что позиции столбцов - даже если вы предполагаете, что таблица никогда не меняется - создают абсолютно НЕЗАКАЗАННЫЙ и, следовательно, невозможно поддерживать код. Помните ли вы, что столбец 13 был "last_name_3" через 2 года?
Обратите внимание, что если ваша проблема в том, что, например, у вас есть что-то вроде SELECT fn11, fn12, fn13, ... fn32
в вашем коде, и вы чувствуете, что изложение fn11..fn32 - это перетаскивание, вы не только на 100% правы, но вы должны абсолютно Удалите указанное перетаскивание через идиомы Perl следующим образом: "SELECT " . join(", ", map { "fn$_" } (11..32));
Сказав, что, если вы хотите знать, как сделать это ТЕОРЕТИЧЕСКИ, просто как упражнение «крутой технологический трюк», я не знаю хорошего способа сделать это в общем случае через DBI, но вы обычно можете это сделать в зависимости от базы данных.
Для этого следует отметить, что:
Практически ВСЕ базы данных создают таблицы с помощью некоего оператора «CREATE TABLE», который принимает ORDERED список столбцов (большинство реляционных баз данных фактически хранят значения в строке в таком порядке, поэтому это важно - даже если теоретически реляционный исчисление рассматривает столбцы как беспорядочные, как сказал marcog.
Практически ВСЕ да; табазы содержат специальную таблицу, в которой перечисляются, какие таблицы содержат какие столбцы (syscolumns
в Sybase, INFORMATION_SCHEMA.COLUMNS
в MySQL), и эта таблица содержит числовой идентификатор столбец, который используется для упорядочивания их так же, как порядок «создания»; или даже специальное поле «заказ» (например, ORDINAL_POSITION
значение в MySQL).
Таким образом, вы можете - заблаговременно - запросить упорядоченный список столбцов для нужной таблицы и их порядок. Чтобы запросить MySQL, SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. Сохраните данные в списке @columns (или, если у вас много таблиц, хэш массивов,% столбцов, ключом является имя таблицы).
Затем, при построении запроса, вы просто говорите
"select $columns{table1}->[11],$columns{table1}->[13], ...."
Обратите внимание, что фактический SQL, отправляемый на сервер, будет содержать имена столбцов, НО вы не будете жестко кодировать эти имена где-либо в вашем коде.