32

我想知道 mysqldump 中是否有任何方法可以添加适当的创建表选项 [IF NOT EXISTS]。有任何想法吗?

4

8 回答 8

33

尝试在您的 SQL 文件上使用它:

sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>

或保存

sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>

这并不理想,但它有效:P

于 2010-11-09T11:21:57.907 回答
20

根据一个消息来源,mysqldump 没有此选项。

您可以--force在导入转储文件时使用该选项,其中 MySQL 将忽略尝试创建重复表所产生的错误。但是请注意,使用此方法,其他错误也将被忽略。

否则,您可以通过脚本运行转储文件,该脚本将替换所有出现的CREATE TABLEwith CREATE TABLE IF NOT EXISTS

于 2010-02-08T09:17:16.503 回答
15

按照@Pawelsed的描述使用效果很好。然而,您可能不喜欢通过比绝对必要的更多潜在错误源来传输数据的想法。在这种情况下,可以使用两个单独的转储:

  • 第一个包含表定义的转储 ( --no-data --skip-add-drop-table)
  • 仅包含数据的第二次转储 ( --no-create-info --skip-add-drop-table)

不过,还有一些其他的事情需要处理(例如触发器)。详情请查看手册。

于 2012-11-13T15:20:39.353 回答
7

不是您可能想要的,但--add-drop-table每个 CREATE 都以相应的 DROP TABLE 语句为前缀。

否则,我会进行简单的搜索/替换(例如,使用sed)。

于 2010-02-08T09:15:03.123 回答
4

转储输出是 DROP 和 CREATE 的组合,因此您必须删除 DROP 语句并更改 CREATE 语句以形成有效(逻辑)输出:

 mysqldump --no-data -u root <schema> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /'| sed 's/^DROP TABLE IF EXISTS /-- DROP TABLE IF EXISTS /' > <schema>.sql
于 2017-06-03T07:18:34.343 回答
3

用这个创建一个 bash 脚本......确保你使它可执行。(chmod 0777 转储.sh)

转储文件

#!/bin/bash

name=$HOSTNAME
name+="-"
name+=$(date +"%Y-%m-%d.%H:%M")
name+=".sql"
echo $name;
mysqldump --replace --skip-add-drop-table --skip-comments izon -p > "$name"
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' "$name"
于 2014-12-18T21:51:48.393 回答
1

如果没有'g'(全局),sed 会快得多:

例如:

mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql 
于 2017-03-28T14:35:03.780 回答
0

在 Windows 7 上使用 PowerShell查找和替换文本

打开命令提示符并使用以下命令

powershell -Command "(gc E:\map\map_2017.sql) -replace 'CREATE TABLE', 'CREATE TABLE IF NOT EXISTS' | Out-File E:\map\map_replaced.sql"
  • 第一个参数是文件路径

  • 第二个参数是“查找字符串”

  • 第三个参数是“替换字符串”

此命令将使用替换的文本创建一个新文件。删除从“|”开始的命令 (管道)如果要替换并保存同一文件中的内容。

于 2017-01-31T06:58:28.237 回答