I need to validate table schema using JDBC/Java. In MySQL and H2, I can issue the following query:
SHOW COLUMNS FROM City;
which has the output
+------------+----------+------+-----+---------+----------------+
| 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 | |
+------------+----------+------+-----+---------+----------------+
I am only interested in the columns COLUMN_NAME
, TYPE
and KEY
However, PostgreSQL does not support this query. I tried various combinations based on this post such as the following, but I get weird results.
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'
Can anyone help with the correct SQL.
EDIT: Problem solved. I was getting no entries for some tables while the correct ones for some. It was a problem with using uppercase in the table name. I used lower case city
and it worked fine.