如何在MariaDB中检查列是否为其他列的计算结果?
如何识别数据库中由其他列计算生成的列
1. 查询数据库元数据(针对系统定义的计算列)
不同数据库有专门的系统视图或命令,能直接获取计算列的定义逻辑:
SQL Server
执行以下查询,替换'total'为你要检查的列名:
SELECT OBJECT_NAME(c.object_id) AS TableName, c.name AS ComputedColumnName, cc.definition AS CalculationFormula FROM sys.columns c JOIN sys.computed_columns cc ON c.object_id = cc.object_id AND c.column_id = cc.column_id WHERE c.name = 'total';
结果里的CalculationFormula会显示具体计算逻辑,比如([quantity]*[price]),你可以直接整理成total.TableName = quantity.TableName * price.TableName的格式。
MySQL/MariaDB
用下面的语句查询,同样替换目标列名:
SELECT TABLE_NAME AS TableName, COLUMN_NAME AS ComputedColumnName, COLUMN_DEFAULT AS CalculationFormula FROM information_schema.COLUMNS WHERE COLUMN_NAME = 'total' AND EXTRA LIKE '%GENERATED%';
COLUMN_DEFAULT字段会存储计算表达式,比如(quantity * price)。
PostgreSQL
PostgreSQL的生成列可以通过以下语句查询:
SELECT c.table_name AS TableName, c.column_name AS ComputedColumnName, pg_get_expr(attgenerated, attrelid) AS CalculationFormula FROM information_schema.columns c JOIN pg_attribute a ON c.table_name = relname(a.attrelid) AND c.column_name = a.attname WHERE c.column_name = 'total' AND a.attgenerated != '';
返回的CalculationFormula就是计算规则,比如(quantity * price)。
2. 手动验证数据一致性(针对应用层写入的计算值)
如果该列不是数据库层面定义的计算列,而是应用程序写入的结果,就需要验证所有行是否符合假设的计算逻辑:
-- 示例(适用于多数数据库,语法可微调) SELECT 'total.' || table_name || ' = quantity.' || table_name || ' * price.' || table_name AS CalculationRule FROM your_table_name WHERE total != quantity * price HAVING COUNT(*) = 0;
如果查询能返回结果,说明所有行都满足total = quantity * price,可以确认该列由这两列计算而来。
内容的提问来源于stack exchange,提问作者nghiax
相关产品推荐
相关产品推荐

