我需要使用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_NAME
,TYPE
和KEY
但是,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
,它工作正常。
答案 0 :(得分:0)
如果使用JDBC,则可以使用JDBC's metadata features。
对于与驱动程度无关的选项,您可以查询information_schema
- 在这种情况下,您需要information_schema.tables
,information_schema.columns
,information_schema.table_constraints
和information_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'