我正在尝试计算 postgres 数据库中 NUMERIC 列的最大长度。数据库中有许多表,其中大多数表包含许多数字列。
我正在将相当大量的 json 数据导入数据库。如果目标列精度/小数位数小于输入的,则 SQLModel 或 pydantic 无法插入数字字段。目前,我正在将数据播种到通用NUMERIC(16,5)
列中,但我想通过优化列大小来减少存储空间。(我的是一个半只读数据集,以后列的大小不会有太大差异)
作为参考,以下是我解决问题的失败......
SELECT
table_schema,
TABLE_NAME,
COLUMN_NAME,
(
xpath (
'/row/max/text()',
query_to_xml (
format (
'SELECT LENGTH ( CAST ( MAX ( %I ) AS CHARACTER VARYING ( 40 ) ) ) from %I.%I',
COLUMN_NAME,
table_schema,
TABLE_NAME
),
TRUE,
TRUE,
''
)
)
) [ 1 ] :: TEXT :: INT AS max_length
FROM
information_schema.COLUMNS
WHERE
table_schema = 'public'
AND data_type = 'numeric'
ORDER BY
table_schema,
TABLE_NAME,
COLUMN_NAME;
更好的方法是将最大列长度拆分为精度和比例。