Du bör nästan ALDRIG förlita dig på kolumnnummer i en tabell i någon av dina koder (även om du teoretiskt sett KAN göra det tekniskt).
Det finns många anledningar, en av de viktigaste är att någon alltid kan ÄNDRA tabellen och infoga en kolumn i början/mitten, vilket bryter din kod helt.
Ett andra skäl är att kolumnpositioner - även om du antar att tabellen aldrig ändras - gör att koden är absolut OLÄSBAR och därför omöjlig att underhålla. Kommer du ihåg att kolumn 13 var "last_name_3" om två år?
Observera att om ditt problem är att du till exempel har något som SELECT fn11, fn12, fn13, ... fn32
i din kod, och du känner för att stava ut fn11..fn32 är ett drag, du är inte bara 100% korrekt, utan du bör absolut ta bort nämnda drag via Perl-idiom, enligt följande:"SELECT " . join(", ", map { "fn$_" } (11..32));
Med det sagt, om du vill veta hur man gör det TEORETISKT, bara som en "cool teknologisk trick"-övning, så vet jag inte om ett bra sätt att göra det generiskt via DBI, men du kan vanligtvis göra det i databasen- specifikt sätt.
För att göra det bör du notera att:
-
I stort sett ALLA databaser skapar tabeller via någon sorts "CREATE TABLE"-sats som tar en ORDERED-lista med kolumner (de flesta relationsdatabaser lagrar faktiskt värden i raden i den ordningen så det är viktigt - även om teoretisk relationskalkyl behandlar kolumner som ordning- mindre som Marcog sa).
-
I stort sett ALLA da;tabaser innehåller en speciell tabell som listar vilka tabeller som innehåller vilka kolumner (
syscolumns
i Sybase,INFORMATION_SCHEMA.COLUMNS
i MySQL), och den tabellen innehåller numeriskt ID för en kolumn som används för att ordna dem på samma sätt som "skapa" ordning; eller till och med speciellt "order"-fält (t.ex.ORDINAL_POSITION
värde i MySQL).Så du kan - i förväg - fråga efter en ordnad lista med kolumner för den tabell du vill ha och deras ordning. För att fråga efter MySQL,
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. Lagra data i @columns-listan (eller om du har många tabeller, en hash av arrayer, %columns, med tabellnamnet som nyckeln).Sedan, när du bygger en fråga, säger du bara
"select $columns{table1}->[11],$columns{table1}->[13], ...."
Observera att den faktiska SQL som skickas till servern kommer att innehålla kolumnnamn, MEN du kommer inte att hårdkoda dessa namn någonstans i din kod.