[prev in list] [next in list] [prev in thread] [next in thread] 

List:       mysql
Subject:    RE: Need query to determine different column definitions across tables
From:       Rick James <rjames () yahoo-inc ! com>
Date:       2013-07-10 1:05:48
Message-ID: 582AFBFC517D194489EF570FE21694CF141EAF1E () GQ1-MB04-02 ! y ! corp ! yahoo ! com
[Download RAW message or body]

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:daevid@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:daevid@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

[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic