mysqldump工具默认情况下是按照表名的字母顺序进行导出

mysqldump工具默认情况下是按照表的字典顺序(即表名的字母顺序)来导出表的,而不是根据表之间的主外键依赖关系。这意味着如果数据库中的表存在外键约束,并且数据导出顺序对还原时保持数据完整性很重要,直接使用不带特殊选项的mysqldump可能不会按照依赖关系正确地导出数据。

如果需要严格按依赖排序,可能需要自定义脚本或使用其他工具来先确定依赖关系,再按序导出。

mysqldump 默认按字母顺序导出表的示例

连接到本机MySQL服务器,用户名为admin,之后手动输入密码:

mysql -u admin -h localhost -p 
create database db1;
use db1;
## products (商品表)
CREATE TABLE `products` (
  `product_id` INT(11) NOT NULL AUTO_INCREMENT,
  `product_name` VARCHAR(255) NOT NULL,
  `price` DECIMAL(10, 2) DEFAULT NULL,
  PRIMARY KEY (`product_id`)
);
## orders (订单表),含有对商品表的外键引用
CREATE TABLE `orders` (
  `order_id` INT(11) NOT NULL AUTO_INCREMENT,
  `customer_id` INT(11) NOT NULL,
  `product_id` INT(11) DEFAULT NULL,
  `quantity` INT(11) DEFAULT NULL,
  PRIMARY KEY (`order_id`),
  KEY `fk_products_idx` (`product_id`),
  CONSTRAINT `fk_products` FOREIGN KEY (`product_id`) REFERENCES `products` (`product_id`) ON DELETE SET NULL ON UPDATE CASCADE
);
mysqldump -u admin -h localhost -p db1 >db1.sql

生成的db1.sql的内容如下:

– MySQL dump 10.13 Distrib 8.0.35, for Win64 (x86_64)

– Host: localhost Database: db1


– Server version 8.0.35

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT /;
/
!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS /;
/
!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION /;
/
!50503 SET NAMES utf8mb4 /; /!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE
/; /!40103 SET TIME_ZONE=‘+00:00’ /; /!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 /; /!40014 SET
@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 /;
/
!40101 SET @OLD_SQL_MODE=@@SQL_MODE,
SQL_MODE=‘NO_AUTO_VALUE_ON_ZERO’ /; /!40111 SET
@OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


– Table structure for table orders

DROP TABLE IF EXISTS orders; /*!40101 SET @saved_cs_client =
@@character_set_client /; /!50503 SET character_set_client = utf8mb4
/; CREATE TABLE orders ( order_id int NOT NULL AUTO_INCREMENT, customer_id int NOT NULL, product_id int DEFAULT NULL,
quantity int DEFAULT NULL, PRIMARY KEY (order_id), KEY
fk_products_idx (product_id), CONSTRAINT fk_products FOREIGN
KEY (product_id) REFERENCES products (product_id) ON DELETE SET
NULL ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_0900_ai_ci; /
!40101 SET character_set_client =
@saved_cs_client */;


– Dumping data for table orders

LOCK TABLES orders WRITE; /*!40000 ALTER TABLE orders DISABLE KEYS
/; /!40000 ALTER TABLE orders ENABLE KEYS */; UNLOCK TABLES;


– Table structure for table products

DROP TABLE IF EXISTS products; /*!40101 SET @saved_cs_client =
@@character_set_client /; /!50503 SET character_set_client = utf8mb4
/; CREATE TABLE products ( product_id int NOT NULL AUTO_INCREMENT, product_name varchar(255) NOT NULL, price
decimal(10,2) DEFAULT NULL, PRIMARY KEY (product_id) )
ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/
!40101 SET character_set_client = @saved_cs_client */;


– Dumping data for table products

LOCK TABLES products WRITE; /*!40000 ALTER TABLE products DISABLE
KEYS /; /!40000 ALTER TABLE products ENABLE KEYS /; UNLOCK
TABLES; /
!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE /; /!40014 SET
FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS /; /!40014 SET
UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS /; /!40101 SET
CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT /; /!40101 SET
CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS /; /!40101 SET
COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION /; /!40111 SET
SQL_NOTES=@OLD_SQL_NOTES */;

– Dump completed on 2024-05-08 9:41:53

这个例子说明了,如果直接使用mysqldump不加特别排序选项的话,表orders的确会先于products被导出,因为o在字母表中位于p之前。但是,正如之前讨论的,这样的导出顺序可能会导致问题,尤其是在导入数据时,因为orders表中引用了products表的外键。

mysqldump手动按顺序导出导入表的示例

对于productsorders这两个表,考虑到orders表中有一个外键引用了products表的product_id,正确的导出和导入步骤如下,以确保数据的一致性和完整性:

导出步骤

  1. 单独导出products

    首先,单独导出products表,确保所有产品信息先被保存下来,不会受到后续操作的影响。

    mysqldump -u [username] -h [hostname] -p[password] [database_name] products > products.sql
    
  2. 单独导出orders

    接着,导出orders表,该表包含对products表的引用。

    mysqldump -u [username] -p[password] [database_name] orders > orders.sql
    

导入步骤

在新的数据库环境中,按照依赖关系顺序进行导入:

  1. 创建数据库(如果需要)

    如果目标数据库不存在,首先创建数据库。

    mysql -u [username] -h [hostname] -p[password] -e "CREATE DATABASE IF NOT EXISTS [new_database_name];"
    
  2. 导入products

    首先导入products表的结构和数据,因为它是被orders表所依赖的。

    mysql -u [username] -h [hostname] -p[password] [new_database_name] < products.sql
    
  3. 导入orders

    确保products表已经成功导入后,再导入orders表,这样外键约束可以正常应用。

    mysql -u [username] -h [hostname] -p[password] [new_database_name] < orders.sql
    

如果您是想了解如何使用SQL查询来展示数据库表之间的外键依赖关系,以便于在使用mysqldump之前手动安排导出顺序,这里有一个基本的SQL示例,它适用于MySQL数据库来查询哪些表引用了哪些其他表作为外键。这可以帮助您手动决定导出的顺序。

SELECT 
    TABLE_NAME AS ' referencing_table',
    REFERENCED_TABLE_NAME AS 'referenced_table'
FROM
    INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE
    TABLE_SCHEMA = 'db1' AND REFERENCED_TABLE_NAME IS NOT NULL;

±------------------±-----------------+ | referencing_table | referenced_table |
±------------------±-----------------+ | orders | products |
±------------------±-----------------+

这个查询会列出所有具有外键约束的表,以及它们各自引用的表。基于这个结果,您可以决定先导出哪些表(通常是那些没有被其他表引用的表,即没有作为REFERENCED_TABLE_NAME出现的表),然后再导出那些有外键指向其他表的表。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
mysqldump工具MySQL数据库自带的客户端工具,用于备份和导出MySQL数据库中的数据。它可以将一个或多个数据库中的表结构和数据以SQL语句的形式导出到文件中,方便进行数据的备份和迁移。 mysqldump工具通过命令行方式进行操作,可以使用各种参数和选项来控制导出的数据内容和格式。通过mysqldump工具,我们可以实现对MySQL数据库进行逻辑全备,即备份多个业务库的数据,并将其导出到指定的文件中。 如果需要详细了解mysqldump工具的用法和相关命令,可以参考MySQL官方文档或其他相关资料。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [MySQL逻辑备份工具mysqldump的实践总结](https://blog.csdn.net/weixin_43733154/article/details/104770959)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [MySQLmysqldump工具用法详解](https://download.csdn.net/download/weixin_38663733/12830598)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值