如果mysqldump中不存在,则创建表

如果mysqldump中不存在,则创建表,mysql,mysqldump,Mysql,Mysqldump,我想知道在mysqldump中是否有任何方法可以添加适当的createtable选项[如果不存在]。有什么想法吗?不是您想要的,而是使用--add drop table每个CREATE都以相应的drop table语句作为前缀 否则,我会进行简单的搜索/替换(例如,使用sed)。根据,mysqldump没有此选项 当导入转储文件时,可以使用--force选项,MySQL将忽略创建重复表时产生的错误。但是请注意,使用此方法,其他错误也将被忽略 否则,您可以通过脚本运行转储文件,该脚本将所有出现的C

我想知道在mysqldump中是否有任何方法可以添加适当的createtable选项[如果不存在]。有什么想法吗?

不是您想要的,而是使用
--add drop table
每个CREATE都以相应的drop table语句作为前缀

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

根据,mysqldump没有此选项

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


否则,您可以通过脚本运行转储文件,该脚本将所有出现的
CREATE TABLE
替换为
CREATE TABLE(如果不存在)

尝试在SQL文件上使用该脚本:

sed 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>
sed's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g'
还是为了拯救

sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' <file-path>
sed-i的/CREATE TABLE/CREATE TABLE如果不存在/g'

这并不理想,但它可以工作:p

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

  • 包含表定义的第一个转储(
    --无数据--跳过添加-删除表
  • 仅包含数据的第二次转储(
    --无创建信息--跳过添加-删除表

不过,还有其他一些事情需要注意(例如触发器)。有关详细信息,请参阅手册。

使用此。。。 确保它是可执行的。(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"

使用PowerShell查找并替换Windows 7上的文本

打开命令提示符并使用下面的命令

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

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

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

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

如果在sed末尾没有“g”(全局),sed将快得多:

例如:

mysqldump-e | sed的/^CREATE TABLE/如果不存在,则创建TABLE/'>.sql

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

mysqldump--no data-u root | sed's/^CREATE TABLE/如果不存在则创建TABLE/'| sed's/^DROP TABLE IF EXISTS/--DROP TABLE IF EXISTS/'>.sql

希望数据库中没有包含该特定字符串的数据。:)您可以通过扩展匹配项来减少错误,
$sed's/^CREATE TABLE foo/CREATE TABLE IF NOT EXISTS foo/g'
如果要使最终SQL生效,必须删除DROP TABLE IF EXISTS。
mysqldump -e <database> | sed 's/^CREATE TABLE /CREATE TABLE IF NOT EXISTS /' > <database>.sql 
 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