DBMS独立访问表模式的方式,包括主键(如果有)

时间:2014-08-31 16:36:26

标签: mysql sql postgresql

我需要使用JDBC / Java验证表模式。 在MySQL和H2中,我可以发出以下查询:

SHOW COLUMNS FROM City;

有输出

+------------+----------+------+-----+---------+----------------+
| COLUMN_NAME| TYPE     | Null | KEY | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

我只对列COLUMN_NAMETYPEKEY

感兴趣

但是,PostgreSQL不支持此查询。我尝试了基于this post的各种组合,如下所示,但我得到了奇怪的结果。

SELECT c.COLUMN_NAME as COLUMN_NAME, c.DATA_TYPE as TYPE, 
CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRI' ELSE '' END AS KEY
FROM INFORMATION_SCHEMA.COLUMNS c
LEFT JOIN (
            SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME
            FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku
                ON tc.CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
         )   pk 
ON  c.TABLE_CATALOG = pk.TABLE_CATALOG
            AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA
            AND c.TABLE_NAME = pk.TABLE_NAME
            AND c.COLUMN_NAME = pk.COLUMN_NAME
WHERE c.TABLE_NAME = 'City'

任何人都可以帮助使用正确的SQL。

编辑:问题解决了。我没有获得某些表的条目,而有些表正确。在表名中使用大写是一个问题。我使用小写city,它工作正常。

2 个答案:

答案 0 :(得分:0)

如果使用JDBC,则可以使用JDBC's metadata features

对于与驱动程度无关的选项,您可以查询information_schema - 在这种情况下,您需要information_schema.tablesinformation_schema.columnsinformation_schema.table_constraintsinformation_schema.key_column_usage

答案 1 :(得分:0)

问题中的代码是以dbms和驱动程序无关的方式读取模式的正确方法。问题出在表名的情况下。在名称中使用大写字符会导致一个似乎是错误的问题。 (仅在PostgreSQL中测试过);

以下SQL工作正常,我将City更改为city

SELECT c.COLUMN_NAME as COLUMN_NAME, c.DATA_TYPE as TYPE, 
CASE WHEN pk.COLUMN_NAME IS NOT NULL THEN 'PRI' ELSE '' END AS KEY
FROM INFORMATION_SCHEMA.COLUMNS c
LEFT JOIN (
            SELECT ku.TABLE_CATALOG,ku.TABLE_SCHEMA,ku.TABLE_NAME,ku.COLUMN_NAME
            FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS AS tc
            INNER JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE AS ku
                ON tc.CONSTRAINT_TYPE = 'PRIMARY KEY' 
                AND tc.CONSTRAINT_NAME = ku.CONSTRAINT_NAME
         )   pk 
ON  c.TABLE_CATALOG = pk.TABLE_CATALOG
            AND c.TABLE_SCHEMA = pk.TABLE_SCHEMA
            AND c.TABLE_NAME = pk.TABLE_NAME
            AND c.COLUMN_NAME = pk.COLUMN_NAME
WHERE c.TABLE_NAME = 'city'
相关问题