文章目录
前言
在数据迁移中,我们经常需要比较两个表,以便在一个表中标识另一个表中没有相应记录的记录。
例如,我们有一个新的数据库,其架构与旧数据库不同。我们的任务是将所有数据从旧数据库迁移到新数据库,并验证数据是否正确迁移。要检查数据,我们必须比较两个表,一个在新数据库中,一个在旧数据库中,并标识不匹配的记录。
接下来我们使用union all关联两张表,完事使用临时表或者说派生表的方式来进行数据对比~
一、准备工作
DROP TABLE IF EXISTS `t1`;
CREATE TABLE `t1` (
`tid` tinyint(4) NOT NULL AUTO_INCREMENT COMMENT '主键id',
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`tid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
表:t1插入一条数据
INSERT INTO `t1` VALUES (1, '张三', 18);
DROP TABLE IF EXISTS `t2`;
CREATE TABLE `t2` (
`tid` tinyint(4) NOT NULL AUTO_INCREMENT,
`nickname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称',
`age` int(11) NULL DEFAULT NULL COMMENT '年龄',
`gender` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`tid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
表:t2插入一条数据
INSERT INTO `t2` VALUES (1, '张三', 18, '男');
注意:可以看到t1、t2表属性值对应都是一样的
二、使用测试
SELECT
tid,
nickname,
age
FROM
( SELECT tid, nickname, age FROM t1 UNION ALL SELECT tid, nickname, age FROM t2 ) tbl
GROUP BY
tid,
nickname,
age
HAVING
count(*) = 1
ORDER BY
tid;
运行之后当然是没有任何返回数据的,因为它们是没有什么差别的。不着急哈,咱们再来在t2表中插入一行数据:
INSERT INTO t2 ( nickname, age, gender )
VALUES
( '李四', 18, '男' );
再次执行SQL(因为‘李四’这条数据,表t1、t2相关属性值两表不存在重复就会查询出来):