RE: Need query to determine different column definitions across tables

2013-07-09 Thread Rick James
Another flavor to try:

SELECT  COLUMN_NAME,
group_concat(db_tbl SEPARATOR ' ') as db_tbls,
group_concat(DISTINCT info SEPARATOR ' | ') as infos
FROM (
SELECT  COLUMN_NAME,
concat(TABLE_SCHEMA, '.', TABLE_NAME) as db_tbl,
concat(COLUMN_TYPE, ' ', CHARACTER_SET_NAME) as info
FROM  `COLUMNS`
WHERE TABLE_SCHEMA = 'test'  -- optionally restrict to a db
 ) x
GROUP BY COLUMN_NAME
HAVING infos LIKE '%|%';

Notice how it uses GROUP_CONCAT() and HAVING to do the filtering.

> -Original Message-
> From: Daevid Vincent [mailto:dae...@daevid.com]
> Sent: Monday, July 08, 2013 7:57 PM
> To: mysql@lists.mysql.com
> Subject: RE: Need query to determine different column definitions across
> tables
> 
> 
> 
> > -Original Message-
> > From: Daevid Vincent [mailto:dae...@daevid.com]
> > Sent: Monday, July 08, 2013 2:11 PM
> > To: mysql@lists.mysql.com
> > Subject: Need query to determine different column definitions across
> tables
> >
> > I'm noticing that across our several databases and hundreds of tables
> > that column definitions are not consistent. I'm wondering if there is
> > a tool or query (using INFORMATION_SCHEMA perhaps) that will show me
> > all databases, tables and columns where they don't match (by column
> name).
> >
> > For example in one table `foo_id` might be UNSIGNED and in other's it
> > is not. Or maybe it's INT(11) in some and INT(10) or worse MEDIUMINT
> > in
> others.
> > Or extending further Charset/Collation might mismatch and be that
> > stupid "latin1_swedish_ci" and fixed to be "utf8" in others.
> >
> > Stuff like that. I want to see everything where there is some
> difference.
> 
> Well, here's the query I'm using currently. Will post updates as I tweak
> it.
> 
> USE `information_schema`;
> 
> SELECT
> t1.`COLUMN_NAME`,
> t1.`TABLE_NAME`,
> t1.`COLUMN_TYPE`,
> -- CONCAT(t1.`TABLE_NAME`,'.',t1.`COLUMN_TYPE`) as t1_type,
> t2.`TABLE_NAME`,
> t2.`COLUMN_TYPE`
> -- CONCAT(t2.`TABLE_NAME`,'.',t2.`COLUMN_TYPE`) AS t2_type FROM
> `COLUMNS` AS t1
> LEFT JOIN `COLUMNS` AS t2
>  ON t1.`COLUMN_NAME` = t2.`COLUMN_NAME`
> AND t1.`COLUMN_TYPE` <> t2.`COLUMN_TYPE`
> WHERE t1.`TABLE_SCHEMA` = 'mydatabase'
>   AND t2.`TABLE_NAME` IS NOT NULL
> -- HAVING t2_type IS NOT NULL
> ORDER BY `COLUMN_NAME` ASC;
> 
> Having separate columns there is easier to read/compare than CONCAT() I
> think.
> 
> Another bulk version that comes in handy:
> 
> SELECT `COLUMN_NAME`, `COLUMN_TYPE`, `TABLE_SCHEMA`,
>   `TABLE_NAME`, `CHARACTER_SET_NAME`, `COLLATION_NAME`
> FROM   `COLUMNS` WHERE `TABLE_SCHEMA` = ' mydatabase '
> ORDER BY `COLUMN_NAME`;
> 
> 
> 
> --
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:http://lists.mysql.com/mysql


--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql



RE: Need query to determine different column definitions across tables

2013-07-08 Thread Daevid Vincent


> -Original Message-
> From: Daevid Vincent [mailto:dae...@daevid.com]
> Sent: Monday, July 08, 2013 2:11 PM
> To: mysql@lists.mysql.com
> Subject: Need query to determine different column definitions across
tables
> 
> I'm noticing that across our several databases and hundreds of tables that
> column definitions are not consistent. I'm wondering if there is a tool or
> query (using INFORMATION_SCHEMA perhaps) that will show me all databases,
> tables and columns where they don't match (by column name).
> 
> For example in one table `foo_id` might be UNSIGNED and in other's it is
> not. Or maybe it's INT(11) in some and INT(10) or worse MEDIUMINT in
others.
> Or extending further Charset/Collation might mismatch and be that stupid
> "latin1_swedish_ci" and fixed to be "utf8" in others.
> 
> Stuff like that. I want to see everything where there is some difference.

Well, here's the query I'm using currently. Will post updates as I tweak it.

USE `information_schema`;

SELECT 
t1.`COLUMN_NAME`,
t1.`TABLE_NAME`,
t1.`COLUMN_TYPE`,
-- CONCAT(t1.`TABLE_NAME`,'.',t1.`COLUMN_TYPE`) as t1_type,
t2.`TABLE_NAME`,
t2.`COLUMN_TYPE`
-- CONCAT(t2.`TABLE_NAME`,'.',t2.`COLUMN_TYPE`) AS t2_type
FROM
`COLUMNS` AS t1 
LEFT JOIN `COLUMNS` AS t2 
   ON t1.`COLUMN_NAME` = t2.`COLUMN_NAME` 
AND t1.`COLUMN_TYPE` <> t2.`COLUMN_TYPE` 
WHERE   t1.`TABLE_SCHEMA` = 'mydatabase' 
AND t2.`TABLE_NAME` IS NOT NULL
-- HAVING t2_type IS NOT NULL
ORDER BY `COLUMN_NAME` ASC;

Having separate columns there is easier to read/compare than CONCAT() I
think.

Another bulk version that comes in handy:

SELECT `COLUMN_NAME`, `COLUMN_TYPE`, `TABLE_SCHEMA`, 
`TABLE_NAME`, `CHARACTER_SET_NAME`, `COLLATION_NAME` 
FROM   `COLUMNS` WHERE `TABLE_SCHEMA` = ' mydatabase ' 
ORDER BY `COLUMN_NAME`;



-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql



RE: Need query to determine different column definitions across tables

2013-07-08 Thread Rick James
See if you like this:
SELECT  TABLE_SCHEMA as db, TABLE_NAME, COLUMN_NAME,
CHARACTER_SET_NAME, COLUMN_TYPE
FROM  `COLUMNS`
ORDER BY  3,4,5;

You might be able to embellish on it to avoid consistent definitions, etc.

> -Original Message-
> From: Daevid Vincent [mailto:dae...@daevid.com]
> Sent: Monday, July 08, 2013 2:11 PM
> To: mysql@lists.mysql.com
> Subject: Need query to determine different column definitions across
> tables
> 
> I'm noticing that across our several databases and hundreds of tables that
> column definitions are not consistent. I'm wondering if there is a tool or
> query (using INFORMATION_SCHEMA perhaps) that will show me all databases,
> tables and columns where they don't match (by column name).
> 
> For example in one table `foo_id` might be UNSIGNED and in other's it is
> not. Or maybe it's INT(11) in some and INT(10) or worse MEDIUMINT in
> others.
> Or extending further Charset/Collation might mismatch and be that stupid
> "latin1_swedish_ci" and fixed to be "utf8" in others.
> 
> Stuff like that. I want to see everything where there is some difference.

--
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:http://lists.mysql.com/mysql