Bootstrap

AnolisOS 8.8 PostgreSQL 同表结构对比

        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';
;