Non dovresti quasi MAI fare affidamento sul numero di colonna in una tabella in nessuno dei tuoi codici (anche se in teoria puoi farlo tecnicamente).
Ci sono molte ragioni, una delle più importanti è che qualcuno può sempre ALTERARE la tabella e inserire una colonna all'inizio/al centro, rompendo completamente il tuo codice.
Un secondo motivo è che le posizioni delle colonne, anche se si presume che la tabella non cambi mai, rendono assolutamente ILLEGGIBILE e quindi impossibile mantenere il codice. Ricorderai che la colonna 13 era "cognome_3" tra 2 anni?
Tieni presente che se il tuo problema è che ad esempio hai qualcosa come SELECT fn11, fn12, fn13, ... fn32
nel tuo codice, e ti senti come se lo spelling fn11..fn32 sia una seccatura, non solo sei corretto al 100%, ma dovresti assolutamente rimuovere detto trascinamento tramite idiomi Perl, come segue:"SELECT " . join(", ", map { "fn$_" } (11..32));
Detto questo, se vuoi sapere come farlo TEORICAMENTE, proprio come un esercizio di "cool tecnologico trucco", non conosco un buon modo per farlo genericamente tramite DBI, ma di solito puoi farlo in database- modo specifico.
Per fare ciò, dovresti notare che:
-
Praticamente TUTTI i database creano tabelle tramite una sorta di istruzione "CREATE TABLE" che accetta un elenco ORDERED di colonne (la maggior parte dei database relazionali in realtà memorizza fisicamente i valori nella riga in quell'ordine, quindi è importante, anche se il calcolo relazionale teorico tratta le colonne come ordine- meno come diceva Marcog).
-
Praticamente TUTTI i database contengono una tabella speciale che elenca quali tabelle contengono quali colonne (
syscolumns
in Sybase,INFORMATION_SCHEMA.COLUMNS
in MySQL) e quella tabella contiene l'ID numerico di una colonna che viene utilizzata per ordinarli allo stesso modo dell'ordine "crea"; o anche un campo speciale "ordine" (es.ORDINAL_POSITION
valore in MySQL).Quindi, puoi - in anticipo - interrogare l'elenco ordinato di colonne per la tabella che desideri e il loro ordine. Per eseguire query su MySQL,
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. Archivia i dati nell'elenco @columns (o se hai molte tabelle, un hash di array, %columns, con il nome della tabella come chiave).Quindi, quando crei una query, dici semplicemente
"select $columns{table1}->[11],$columns{table1}->[13], ...."
Tieni presente che il effettivo L'SQL inviato al server conterrà i nomi delle colonne, MA non codificherai quei nomi in nessuna parte del tuo codice.