-- This could also be done with making MySQL itself return a non-redundant structure -- in JSON to simplify the processing within the engine. SELECT c.TABLE_SCHEMA, c.TABLE_NAME, c.COLUMN_NAME, c.ORDINAL_POSITION, c.COLUMN_DEFAULT, c.IS_NULLABLE, c.DATA_TYPE, c.COLUMN_TYPE, c.COLUMN_KEY, c.COLUMN_COMMENT, k.CONSTRAINT_NAME, k.ORDINAL_POSITION, k.POSITION_IN_UNIQUE_CONSTRAINT, k.REFERENCED_TABLE_SCHEMA, k.REFERENCED_TABLE_NAME, k.REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS c LEFT OUTER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE k ON c.TABLE_NAME = k.TABLE_NAME AND c.TABLE_SCHEMA = k.TABLE_SCHEMA AND c.COLUMN_NAME = k.COLUMN_NAME WHERE c.TABLE_SCHEMA = ? ORDER BY c.TABLE_NAME ASC, c.ORDINAL_POSITION ASC ;