首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么MySQL在导入时忽略外键?

为什么MySQL在导入时忽略外键?
EN

Database Administration用户
提问于 2017-04-25 15:52:38
回答 1查看 4.7K关注 0票数 3

我对数据库不太了解,所以请原谅,如果语法不好或者描述不好,但我已经尽力了:)

导入子表时,它会忽略外键,尽管父表是空的,而且还没有任何数据,但我使用以下命令转储没有父表数据的数据

代码语言:javascript
运行
复制
mysqldump --ignore-table --no-create-info old_database > data.sql

然后我将这些数据导入到我创建的新数据库中

代码语言:javascript
运行
复制
mysql new_database < data.sql

然后,我仅使用以下命令转储父行数据

代码语言:javascript
运行
复制
mysqldump --tab="\\uploads" 

导入parent_data如下所示

代码语言:javascript
运行
复制
mysqlimport "\\uploads\parent_data.txt" new_database

为什么MySQL会接受这一点而忽略外键的存在?是否有办法迫使MySQL在导入时不忽略FKs?

子表显示创建信息

代码语言:javascript
运行
复制
| child | 
CREATE TABLE `child` 
(
    `id` bigint(19) NOT NULL,
    `flag` int(10) NOT NULL,
    PRIMARY KEY (`id`, `flag`),
    KEY `FK72610D66B7AE7814` (`flag`),
    CONSTRAINT `FK72610D66AFB765B8` 
        FOREIGN KEY (`id`) REFERENCES `parent` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

父创建信息

代码语言:javascript
运行
复制
| parent | 
CREATE TABLE `parent` 
(
    `id` bigint(19) NOT NULL AUTO_INCREMENT, 
    ...
) ;
EN

回答 1

Database Administration用户

回答已采纳

发布于 2017-04-26 05:06:40

默认情况下,mysqldump自动在转储输出中包含一条语句,将foreign_key_checks设置为0。

因此,如果您希望在导入时强制MySQL不要忽略FKs,请在命令中使用-紧凑开关:

例如:

代码语言:javascript
运行
复制
mysqldump --ignore-table=example.test --compact --no-create-info old_database > data.sql

参考文献:https://dev.mysql.com/doc/refman/5.7/en/mysqldump.html#option_米斯德_紧凑

更新

foreign_key_checks设置为1。这意味着,如果每个DML查询都有FK错误,则查询执行将被拒绝。

为了提高恢复的速度,MySQL设置foreign_key_checks 0 (在转储文件中),在恢复完成之后,MySQL设置foreign_key_checks 1。除非您已经设置了foreign_key_checks 0。

票数 3
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/171955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档