技术问询:如何验证临时表temp1数据是否存在于table1和table2中
验证临时表数据存在性及表结构一致性方案
一、先确认table1与table2列结构完全一致
不同数据库的查询方式略有差异,以下是主流数据库的实现:
MySQL/MariaDB
-- 对比两表的列名、数据类型、空值规则、默认值 SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = 'table1' EXCEPT SELECT COLUMN_NAME, DATA_TYPE, IS_NULLABLE, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME = 'table2';
如果查询返回空结果,说明两表列结构完全一致。
SQL Server
SELECT c.name AS COLUMN_NAME, t.name AS DATA_TYPE, c.is_nullable, c.default_object_id FROM sys.columns c JOIN sys.types t ON c.system_type_id = t.system_type_id WHERE object_id = OBJECT_ID('table1') EXCEPT SELECT c.name AS COLUMN_NAME, t.name AS DATA_TYPE, c.is_nullable, c.default_object_id FROM sys.columns c JOIN sys.types t ON c.system_type_id = t.system_type_id WHERE object_id = OBJECT_ID('table2');
无返回结果则表示两表结构完全匹配。
PostgreSQL
SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'table1' EXCEPT SELECT column_name, data_type, is_nullable, column_default FROM information_schema.columns WHERE table_schema = 'public' AND table_name = 'table2';
空结果即代表结构一致。
二、验证temp1的数据存在于table1和table2中
因为temp1是从table1创建的,优先验证它与table1的一致性,再确认数据是否都在table2中:
方式1:用EXCEPT排查差异
-- 检查temp1有但table1没有的数据(正常应返回空) SELECT * FROM temp1 EXCEPT SELECT * FROM table1; -- 检查temp1有但table2没有的数据(空结果则所有temp1数据都在table2中) SELECT * FROM temp1 EXCEPT SELECT * FROM table2;
提示:如果表中有重复行,用EXCEPT ALL替代EXCEPT,避免自动去重导致的差异被掩盖。
方式2:通过关联计数验证
-- 先确认temp1和table1行数一致(如果temp1是全量导出table1的话) SELECT COUNT(*) FROM temp1; SELECT COUNT(*) FROM table1; -- 验证temp1每行都在table2中(用主键或唯一标识列关联) SELECT COUNT(*) FROM temp1 t LEFT JOIN table2 t2 ON t.主键列 = t2.主键列 WHERE t2.主键列 IS NULL;
如果最后这条查询返回0,说明temp1的所有数据都存在于table2中;如果没有主键,也可以用全列关联(ON t.* = t2.*,部分数据库支持),但效率会低一些。
内容的提问来源于stack exchange,提问作者Maddyvk
相关产品推荐
相关产品推荐

