如果mysqldump中不存在则创建表

时间:2010-02-08 09:05:39

标签: mysql mysqldump

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

9 个答案:

答案 0 :(得分:24)

尝试在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

答案 1 :(得分:18)

根据one source,mysqldump没有此选项。

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

否则,您可以通过脚本运行转储文件,该脚本将CREATE TABLE替换为CREATE TABLE IF NOT EXISTS

答案 2 :(得分:10)

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

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

还有一些其他事情要处理(例如触发器)。有关详细信息,请查阅手册。

答案 3 :(得分:4)

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

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

答案 4 :(得分:2)

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

dump.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"

答案 5 :(得分:1)

在没有'g'(全局)的情况下,sed将更多更快:

例如:

mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql 

答案 6 :(得分:1)

转储输出是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

答案 7 :(得分: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"
  • 第一个参数是文件路径

  • 第二个参数是找到字符串&#39;

  • 第三个参数是&#39;替换字符串&#39;

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

答案 8 :(得分:0)

根据文档Doc,您可以使用参数--databases, -B

CREATE DATABASE /*!32312 IF NOT EXISTS*/ `name_databse` /*!40100 DEFAULT CHARACTER SET latin1 */;

是在脚本旁边创建的