A different approach would be to arrange all columns alphabetically by altering the table via a SQL procedure. I created one for a couple of the tables in which my users prefer the alphabetic layout while still using the simplified SELECT *
statement.
This code should arranged my index first and then organise all other columns from A-Z. It may be different for your instance but is a good starting point.
DELIMITER ;;
DROP PROCEDURE IF EXISTS ALPHABETISE_TABLE_COLUMNS;
CREATE PROCEDURE ALPHABETISE_TABLE_COLUMNS(IN database_name VARCHAR(64), IN table_name_string VARCHAR(64), IN index_name_string VARCHAR(64))
BEGIN
DECLARE n INT DEFAULT 0;
DECLARE i INT DEFAULT 0;
DECLARE col_name VARCHAR(30) DEFAULT "";
DECLARE col_datatype VARCHAR(10) DEFAULT "";
DECLARE previous_col VARCHAR(30) DEFAULT col_name;
SELECT COUNT(*)
FROM
(SELECT COLUMN_NAME
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = table_name_string) AS TEMP
INTO n;
SET @Q= CONCAT('ALTER TABLE `',database_name,'`.`',table_name_string,'` CHANGE COLUMN `',index_name_string,'` `',index_name_string,'` BIGINT(20) NOT NULL FIRST');
PREPARE exe FROM @Q;
EXECUTE exe;
DEALLOCATE PREPARE exe;
SET n = n-1;
SET i=1;
WHILE i<n DO
SELECT COLUMN_NAME FROM
(SELECT COLUMN_NAME, @row_num:= @row_num + 1 as ind_rows
FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c
WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string
ORDER BY COLUMN_NAME ASC) as TEMP
WHERE ind_rows = i
INTO col_name;
SELECT DATA_TYPE
FROM
(SELECT DATA_TYPE, @row_num:= @row_num + 1 as ind_rows
FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c
WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string
ORDER BY COLUMN_NAME ASC) as TEMP
WHERE ind_rows = i
INTO col_datatype;
IF i = 1 THEN
SET previous_col = index_name_string;
ELSE
SELECT COLUMN_NAME
FROM
(SELECT COLUMN_NAME, @row_num:= @row_num + 1 as ind_rows
FROM INFORMATION_SCHEMA.COLUMNS, (SELECT @row_num:= 0 AS num) AS c
WHERE TABLE_NAME = table_name_string AND COLUMN_NAME <> index_name_string
ORDER BY COLUMN_NAME ASC) as TEMP
WHERE ind_rows = i-1
INTO previous_col;
END IF;
IF col_datatype = 'varchar' THEN
SET col_datatype = 'TEXT';
END IF;
select col_name, previous_col;
IF col_name <> index_name_string OR index_name_string = '' THEN
SET @Q= CONCAT('ALTER TABLE `',database_name,'`.`',table_name_string,'` CHANGE COLUMN `',col_name,'` `',col_name,'` ',col_datatype,' NULL DEFAULT NULL AFTER `',previous_col,'`');
PREPARE exe FROM @Q;
EXECUTE exe;
DEALLOCATE PREPARE exe;
END IF;
SET i = i + 1;
END WHILE;
END;
;;
DELIMITER ;
# NOTE: ASSUMES INDEX IS BIGINT(20), IF OTHER PLEASE ADAPT IN LINE 22 TO MEET DATATYPE
#
# CALL ALPHABETISE_TABLE_COLUMNS('database_name', 'column_name', 'index_name')
Hope this helps!