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

0ve6wy6x  于 2023-03-22  发布在  Mysql
关注(0)|答案(8)|浏览(168)

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

ar5n3qh5

ar5n3qh51#

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

vpfxa7rd

vpfxa7rd2#

根据one source,mysqldump没有此选项。
你可以在导入转储文件时使用--force选项,MySQL将忽略由于尝试创建重复表而产生的错误。但是请注意,使用这种方法,其他错误也会被忽略。
否则,您可以通过一个脚本运行转储文件,该脚本将所有出现的CREATE TABLE替换为CREATE TABLE IF NOT EXISTS

wwwo4jvm

wwwo4jvm3#

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

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

还有一些其他的事情需要注意(eidogg.触发器)。查看手册了解详细信息。

6qfn3psc

6qfn3psc4#

这可能不是您想要的,但是对于--add-drop-table,每个CREATE都以相应的DROP TABLE语句为前缀。
否则,我会使用简单的搜索/替换(例如,使用sed)。

t8e9dugd

t8e9dugd5#

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

ldioqlga6#

用这个创建一个bash脚本。例如dump.shtouch dump.sh
请确保您使其可执行:chmod 0750 dump.sh
dump.sh:

#!/bin/bash

name="mysqldump_${HOSTNAME}_$(date +'%Y-%m-%d_%H-%M').sql"
echo "Using filename: ${name}"
mysqldump --replace --skip-add-drop-table --skip-comments izon -p > "${name}"
sed -i 's/CREATE TABLE/CREATE TABLE IF NOT EXISTS/g' "${name}"
sbtkgmzw

sbtkgmzw7#

sed在结尾没有'g'(global)时会快
例如:

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

fafcakar8#

查找和替换文本在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"
  • 第一个参数是文件路径
  • 第二个参数是'find string'
  • 第三个参数是'replace string'

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

相关问题