PostgreSQL 同表结构对比
说明:现在有两个数据库,想找出两个数据库中相同表存在差异的字段,也就是说相同的表如果在数据库 A 中存在字段,但是在数据库 B 中不存在,反之亦然,找出这些字段。
WITH aa AS (
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'iho'
INTERSECT
SELECT table_name
FROM information_schema.tables
WHERE table_schema = 'public' )
SELECT c.table_schema AS schema_name,
c.table_name,
c.column_name,
c.data_type
FROM information_schema.columns c
WHERE c.table_schema = 'iho'
AND c.table_name IN (SELECT * FROM aa)
AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'public'
AND table_name = c.table_name
AND column_name = c.column_name )
UNION ALL
SELECT c.table_schema AS schema_name,
c.table_name,
c.column_name,
c.data_type
FROM information_schema.columns c
WHERE c.table_schema = 'public'
AND c.table_name IN (SELECT * FROM aa)
AND NOT EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_schema = 'iho'
AND table_name = c.table_name
AND column_name = c.column_name );
延升需求说明:获取一个模式下所有表的表名、列名、列的顺序、列的数据类型、长度、是否为空、默认值、是否主键。
SELECT
c.table_name,
c.column_name,
c.ordinal_position,
c.data_type,
c.character_maximum_length,
c.is_nullable,
c.column_default,
CASE
WHEN kcu.column_name IS NOT NULL THEN 'PRIMARY KEY'
ELSE ''
END AS column_key
FROM
information_schema.columns c
LEFT JOIN information_schema.key_column_usage kcu
ON c.table_schema = kcu.table_schema
AND c.table_name = kcu.table_name
AND c.column_name = kcu.column_name
WHERE c.table_schema = 'iho';