U moet bijna NOOIT vertrouwen op het kolomnummer in een tabel in uw code (ook al KUNT u dit technisch gezien wel doen).
Er zijn veel redenen, een van de belangrijkste is dat iemand altijd de tabel kan WIJZIGEN en een kolom aan het begin / midden kan invoegen, waardoor je code volledig wordt verbroken.
Een tweede reden is dat kolomposities - zelfs als je ervan uitgaat dat de tabel nooit verandert - absoluut ONLEESBARE en daarom onmogelijk te onderhouden code maken. Weet je nog dat kolom 13 over 2 jaar "last_name_3" was?
Houd er rekening mee dat als uw probleem is dat u bijvoorbeeld iets heeft als SELECT fn11, fn12, fn13, ... fn32
in je code, en je hebt zin om te spellen dat fn11..fn32 een sleep is, heb je niet alleen 100% gelijk, maar je moet absoluut de drag verwijderen via Perl-idioom, als volgt:"SELECT " . join(", ", map { "fn$_" } (11..32));
Dat gezegd hebbende, als je wilt weten hoe je het THEORETISCH moet doen, net als een "coole technologische truc" -oefening, ken ik geen goede manier om het generiek te doen via DBI, maar je kunt het meestal doen in database- specifieke manier.
Houd er rekening mee dat:
-
Vrijwel ALLE databases maken tabellen via een soort "CREATE TABLE" -instructie die een ORDERED-lijst met kolommen nodig heeft (de meeste relationele databases slaan fysiek waarden in de rij op in die volgorde, dus het is belangrijk - zelfs als theoretische relationele calculus kolommen als volgorde behandelt- minder zoals marcog zei).
-
Vrijwel ALLE databases bevatten een speciale tabel waarin wordt vermeld welke tabellen welke kolommen bevatten (
syscolumns
in Sybase,INFORMATION_SCHEMA.COLUMNS
in MySQL), en die tabel bevat een numerieke ID van een kolom die wordt gebruikt om ze op dezelfde manier te bestellen als "create" -volgorde; of zelfs een speciaal "bestel"-veld (bijv.ORDINAL_POSITION
waarde in MySQL).U kunt dus - van tevoren - de geordende lijst met kolommen opvragen voor de gewenste tabel en hun volgorde. Voor een query voor MySQL,
SELECT COLUMN_NAME, ORDINAL_POSITION FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME="XXX"
. Sla de gegevens op in de @columns-lijst (of als je veel tabellen hebt, een hash van arrays, %columns, waarbij de tabelnaam de sleutel is).Wanneer u vervolgens een query maakt, zegt u gewoon
"select $columns{table1}->[11],$columns{table1}->[13], ...."
Houd er rekening mee dat de werkelijke SQL die naar de server wordt verzonden, bevat kolomnamen, MAAR u zult die namen nergens in uw code hardcoderen.