Mysql dump restore delete data如果有外键检查设置

Mysql dump restore delete data如果有外键检查设置,mysql,database,docker,foreign-keys,Mysql,Database,Docker,Foreign Keys,我有db_dump.sql 我使用docker compose up-d创建了docker容器 将数据库转储到新创建的容器并插入数据 $ docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql $ docker exec -i mysql sh -c 'exec mysql -uroot -pdev -e "show databases;"' Database information_schema mysql p

我有db_dump.sql

我使用docker compose up-d创建了docker容器

将数据库转储到新创建的容器并插入数据

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev -e "show databases;"'
Database
information_schema
mysql
performance_schema
school

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from class;"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "insert into class (classID, className) values (1, \"test\");"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from class;"'
classID className   _createdTime    _lastUpdateTime _deletedTime
1   test    2019-11-20 15:25:00 2019-11-20 15:25:00 NULL

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "insert into student (classID, studentID, name) values (1, 1, \"test\");"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'
id  studentID   classID name    _createdTime    _deletedTime    _lastUpdateTime
20741715    1   1   test    2019-11-20 15:26:01 NULL    2019-11-20 15:26:01
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'
我做了一些尝试和错误,并找出我是否删除/*!40014设置@OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS,FOREIGN_KEY_CHECKS=0*/;从转储中,它不会删除数据

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev -e "show databases;"'
Database
information_schema
mysql
performance_schema
school

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from class;"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "insert into class (classID, className) values (1, \"test\");"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from class;"'
classID className   _createdTime    _lastUpdateTime _deletedTime
1   test    2019-11-20 15:25:00 2019-11-20 15:25:00 NULL

$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "insert into student (classID, studentID, name) values (1, 1, \"test\");"'
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'
id  studentID   classID name    _createdTime    _deletedTime    _lastUpdateTime
20741715    1   1   test    2019-11-20 15:26:01 NULL    2019-11-20 15:26:01
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql
$ docker exec -i mysql sh -c 'exec mysql -uroot -pdev school -e "select * from student;"'
当db_dump.sql中的父表类前面有子表student时,就会出现此问题

从逻辑上讲,此转储文件在开始之前将外键设置为0,并在结尾处将其设置回/*!40014设置外键检查=@OLD_FOREIGN_KEY_CHECKS*/;,但不知怎的,它还是删除了记录

为什么再次运行转储时会删除记录

docker exec -i mysql sh -c 'exec mysql -uroot -pdev' < db_dump.sql
因为这条线:

/*!40101 DROP TABLE IF EXISTS `student` */;

脚本实际上不是在重新创建数据库,而是在重新创建每个表。

感谢您共享状态报告。有问题吗?可能观察到的行为可以用以下两个语句来解释:DROP TABLE IF EXISTS student和DROP TABLE IF EXISTS ClassYou是否知道MySQL的特殊注释语法/*!…*/?该声明将运行,即使它似乎在评论中。读取后,DROP TABLE将运行,即使您认为它在注释中。请注意,如果存在引用该表的外键约束,DROP TABLE语句的执行将失败,除非我们禁用外键约束的强制,这可以通过将foreign_key_checks系统变量设置为0来实现。这就是sql脚本将该系统变量设置为0的原因。这样DROP TABLE语句就不会因为外键约束而失败。是的,但是如果我删除/*,为什么不重新创建它呢!40014设置外键检查=@OLD_FOREIGN_KEY_CHECKS*/@Nilesh:系统变量“外键检查”的设置决定是否启用或禁用外键约束。将其设置为0将禁用外键约束的强制执行,从而允许DROP TABLE语句成功执行。否则,如果启用了外键约束,则如果存在引用表的任何外键约束,DROP TABLE语句将失败。
/*!40101 DROP TABLE IF EXISTS `student` */;