search
HomeDatabaseMysql Tutorial [原创]如何从数据库层面检测两表内容的一致性

一般来说呢,如何检测两张表的内容是否一致,这样的需求大多在从机上体现,以保证数据一致性。方法无非有两个,第一呢就是从数据库着手,第二呢就是从应用程序端

一般来说呢,如何检测两张表的内容是否一致,这样的需求大多在从机上体现,以保证数据一致性。方法无非有两个,第一呢就是从数据库着手,第二呢就是从应用程序端着手。 我这里罗列了些如何从数据库层面来解决此类问题的方法。

当然第一步就是检查记录数是否一致,否则不用想任何其他方法了。

这里我们用两张表t1_old,t1_new来演示。

表结构:  CREATE TABLE t1_old (   id int(11) NOT NULL,   log_time timestamp DEFAULT NULL ) ;  CREATE TABLE t1_new (   id int(11) NOT NULL,   log_time timestamp DEFAULT NULL ) ; 两表的记录数都为100条。 mysql> select count(*) from t1_old; +----------+ | count(*) | +----------+ |      100 | +----------+ 1 row in set (0.31 sec) mysql> select count(*) from t1_new; +----------+ | count(*) | +----------+ |      100 | +----------+ 1 row in set (0.00 sec)


方法一:用加法然后去重。

由于Union 本身具备把上下两条连接的记录做唯一性排序,所以这样检测来的非常简单。 mysql> select count(*) from (select * from t1_old union select * from t1_new) as T; +----------+ | count(*) | +----------+ |      100 | +----------+ 1 row in set (0.06 sec) 这里的记录数为100,初步证明两表内容一致。但是,这个方法有个BUG,在某些情形下不能简单表示结果集一致。 比如: mysql> create table t1_old1 (id int); Query OK, 0 rows affected (0.27 sec) mysql> create table t1_new1(id int); Query OK, 0 rows affected (0.09 sec) mysql> insert into t1_old1 values (1),(2),(3),(5); Query OK, 4 rows affected (0.15 sec) Records: 4  Duplicates: 0  Warnings: 0 mysql> insert into t1_new1 values (2),(2),(3),(5);     Query OK, 4 rows affected (0.02 sec) Records: 4  Duplicates: 0  Warnings: 0 mysql> select * from t1_old1; +------+ | id   | +------+ |    1 | |    2 | |    3 | |    5 | +------+ 4 rows in set (0.00 sec) mysql> select * from t1_new1; +------+ | id   | +------+ |    2 | |    2 | |    3 | |    5 | +------+ 4 rows in set (0.00 sec) mysql> select count(*) from (select * from t1_old1 union select * from t1_new1) as T; +----------+ | count(*) | +----------+ |        4 | +----------+ 1 row in set (0.00 sec) mysql>  所以在这点上,这个方法等于是无效。


方法二: 用减法来归零。

由于MySQL 没有提供减法操作符,这里我们换做PostgreSQL来检测。 t_girl=# select count(*) from (select * from t1_old except select * from t1_new) as T;  count  -------      0 (1 row) Time: 1.809 ms 这里检测出来结果是0,那么证明两表的内容一致。 那么我们可以针对第一种方法提到的另外一种情况做检测: t_girl=# select count(*) from (select * from t1_old1 except select * from t1_new1) as T;  count  -------      1 (1 row) Time: 9.837 ms

OK,这里检测出来结果不对,那么就直接给出不一致的结论。

第三种: 用全表JOIN,这个也是最烂的做法了,当然我这里指的是在表记录数超级多的情形下。

当然这点我也用PostgreSQL来演示 t_girl=# select count(*) from t1_old as a full outer join t1_new as b using (id,log_time) where a.id is null or b.id is null;   count  -------      0 (1 row) Time: 5.002 ms t_girl=#  结果为0,证明内容一致。


第四种: 用checksum校验。

比如在MySQL 里面,如果两张表的checksum值一致,那么内容也就一致。 mysql> checksum table t1_old; +---------------+----------+ | Table         | Checksum | +---------------+----------+ | t_girl.t1_old | 60614552 | +---------------+----------+ 1 row in set (0.00 sec) mysql> checksum table t1_new; +---------------+----------+ | Table         | Checksum | +---------------+----------+ | t_girl.t1_new | 60614552 | +---------------+----------+ 1 row in set (0.00 sec) 但是这种方法也只局限于两表结构一摸一样。 比如,我修改下表t1_old的字段类型,那么checksum的值也就不一样了。 mysql> alter table t1_old modify id bigint; Query OK, 100 rows affected (0.23 sec) Records: 100  Duplicates: 0  Warnings: 0 mysql> checksum table t1_old; +---------------+------------+ | Table         | Checksum   | +---------------+------------+ | t_girl.t1_old | 3211623989 | +---------------+------------+ 1 row in set (0.00 sec) mysql> checksum table t1_new; +---------------+----------+ | Table         | Checksum | +---------------+----------+ | t_girl.t1_new | 60614552 | +---------------+----------+ 1 row in set (0.00 sec)



所以从上面几种数据库提供的方法来看,用减法来归零相对来说比较可靠,其他的方法比较适合在特定的情形下来检测。


本文出自 “上帝,咱们不见不散!” 博客,,请务必保留此出处

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
MySQL: An Introduction to the World's Most Popular DatabaseMySQL: An Introduction to the World's Most Popular DatabaseApr 12, 2025 am 12:18 AM

MySQL is an open source relational database management system, mainly used to store and retrieve data quickly and reliably. Its working principle includes client requests, query resolution, execution of queries and return results. Examples of usage include creating tables, inserting and querying data, and advanced features such as JOIN operations. Common errors involve SQL syntax, data types, and permissions, and optimization suggestions include the use of indexes, optimized queries, and partitioning of tables.

The Importance of MySQL: Data Storage and ManagementThe Importance of MySQL: Data Storage and ManagementApr 12, 2025 am 12:18 AM

MySQL is an open source relational database management system suitable for data storage, management, query and security. 1. It supports a variety of operating systems and is widely used in Web applications and other fields. 2. Through the client-server architecture and different storage engines, MySQL processes data efficiently. 3. Basic usage includes creating databases and tables, inserting, querying and updating data. 4. Advanced usage involves complex queries and stored procedures. 5. Common errors can be debugged through the EXPLAIN statement. 6. Performance optimization includes the rational use of indexes and optimized query statements.

Why Use MySQL? Benefits and AdvantagesWhy Use MySQL? Benefits and AdvantagesApr 12, 2025 am 12:17 AM

MySQL is chosen for its performance, reliability, ease of use, and community support. 1.MySQL provides efficient data storage and retrieval functions, supporting multiple data types and advanced query operations. 2. Adopt client-server architecture and multiple storage engines to support transaction and query optimization. 3. Easy to use, supports a variety of operating systems and programming languages. 4. Have strong community support and provide rich resources and solutions.

Describe InnoDB locking mechanisms (shared locks, exclusive locks, intention locks, record locks, gap locks, next-key locks).Describe InnoDB locking mechanisms (shared locks, exclusive locks, intention locks, record locks, gap locks, next-key locks).Apr 12, 2025 am 12:16 AM

InnoDB's lock mechanisms include shared locks, exclusive locks, intention locks, record locks, gap locks and next key locks. 1. Shared lock allows transactions to read data without preventing other transactions from reading. 2. Exclusive lock prevents other transactions from reading and modifying data. 3. Intention lock optimizes lock efficiency. 4. Record lock lock index record. 5. Gap lock locks index recording gap. 6. The next key lock is a combination of record lock and gap lock to ensure data consistency.

What are common causes of poor MySQL query performance?What are common causes of poor MySQL query performance?Apr 12, 2025 am 12:11 AM

The main reasons for poor MySQL query performance include not using indexes, wrong execution plan selection by the query optimizer, unreasonable table design, excessive data volume and lock competition. 1. No index causes slow querying, and adding indexes can significantly improve performance. 2. Use the EXPLAIN command to analyze the query plan and find out the optimizer error. 3. Reconstructing the table structure and optimizing JOIN conditions can improve table design problems. 4. When the data volume is large, partitioning and table division strategies are adopted. 5. In a high concurrency environment, optimizing transactions and locking strategies can reduce lock competition.

When should you use a composite index versus multiple single-column indexes?When should you use a composite index versus multiple single-column indexes?Apr 11, 2025 am 12:06 AM

In database optimization, indexing strategies should be selected according to query requirements: 1. When the query involves multiple columns and the order of conditions is fixed, use composite indexes; 2. When the query involves multiple columns but the order of conditions is not fixed, use multiple single-column indexes. Composite indexes are suitable for optimizing multi-column queries, while single-column indexes are suitable for single-column queries.

How to identify and optimize slow queries in MySQL? (slow query log, performance_schema)How to identify and optimize slow queries in MySQL? (slow query log, performance_schema)Apr 10, 2025 am 09:36 AM

To optimize MySQL slow query, slowquerylog and performance_schema need to be used: 1. Enable slowquerylog and set thresholds to record slow query; 2. Use performance_schema to analyze query execution details, find out performance bottlenecks and optimize.

MySQL and SQL: Essential Skills for DevelopersMySQL and SQL: Essential Skills for DevelopersApr 10, 2025 am 09:30 AM

MySQL and SQL are essential skills for developers. 1.MySQL is an open source relational database management system, and SQL is the standard language used to manage and operate databases. 2.MySQL supports multiple storage engines through efficient data storage and retrieval functions, and SQL completes complex data operations through simple statements. 3. Examples of usage include basic queries and advanced queries, such as filtering and sorting by condition. 4. Common errors include syntax errors and performance issues, which can be optimized by checking SQL statements and using EXPLAIN commands. 5. Performance optimization techniques include using indexes, avoiding full table scanning, optimizing JOIN operations and improving code readability.

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

AI Hentai Generator

AI Hentai Generator

Generate AI Hentai for free.

Hot Article

R.E.P.O. Energy Crystals Explained and What They Do (Yellow Crystal)
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Best Graphic Settings
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. How to Fix Audio if You Can't Hear Anyone
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: How To Unlock Everything In MyRise
3 weeks agoBy尊渡假赌尊渡假赌尊渡假赌

Hot Tools

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Dreamweaver Mac version

Dreamweaver Mac version

Visual web development tools

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use