SELECT n.nspname AS "Schema", c.relname AS "TableName"
FROM pg_catalog.pg_class c, pg_namespace n
WHERE c.relnamespace = n.oid
AND n.nspname NOT IN ('information_schema', 'pg_catalog')
AND c.relkind = 'r'
AND NOT EXISTS (
SELECT 1
FROM pg_index i
WHERE c.oid = i.indrelid
AND i.indisprimary = 't'
);
2. 批量增加脚本
DO $$
DECLARE
table_record RECORD;
BEGIN
FOR table_record IN
SELECT n.nspname AS schema_name, c.relname AS table_name
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
AND c.relkind = 'r'
AND NOT EXISTS (
SELECT 1
FROM pg_index i
WHERE c.oid = i.indrelid AND i.indisprimary = 't'
)
LOOP
EXECUTE 'ALTER TABLE "' || table_record.schema_name || '"."' || table_record.table_name || '" REPLICA IDENTITY FULL';
RAISE NOTICE '已设置表: %.%', table_record.schema_name, table_record.table_name;
END LOOP;
END $$;
SELECT
n.nspname AS "Schema",
c.relname AS "TableName",
CASE c.relreplident
WHEN 'd' THEN 'DEFAULT(主键)'
WHEN 'n' THEN 'NOTHING(无)'
WHEN 'f' THEN 'FULL(全表)'
WHEN 'i' THEN 'INDEX(索引)'
END AS "ReplicaIdentity",
-- 是否有主键
CASE
WHEN EXISTS (
SELECT 1
FROM pg_index i
WHERE c.oid = i.indrelid AND i.indisprimary = 't'
) THEN '有'
ELSE '无'
END AS "是否有主键",
-- 表大小
pg_size_pretty(pg_total_relation_size(c.oid)) AS "表大小"
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE n.nspname NOT IN ('information_schema', 'pg_catalog')
AND c.relkind = 'r'
AND NOT EXISTS (
SELECT 1
FROM pg_index i
WHERE c.oid = i.indrelid AND i.indisprimary = 't'
)
ORDER BY
c.relreplident DESC, -- 先显示已设置FULL的表
n.nspname,
c.relname;