【问题标题】:Import and overwrite existing data in MySQL导入和覆盖 MySQL 中的现有数据
【发布时间】:2011-04-01 19:11:27
【问题描述】:

我在一个 MySQL 表中有一个唯一键的数据。我现在想导入存储在 CSV 中的最新数据。如果密钥已经存在,我希望它覆盖旧数据,或者如果密钥不存在,则创建一个新行。有谁知道如何在 MySQL 中做到这一点?

感谢您的帮助!

杰夫

【问题讨论】:

    标签: mysql import


    【解决方案1】:

    使用INSERT ... ON DUPLICATE KEY UPDATE

    INSERT INTO table (column) VALUES ('value') ON DUPLICATE KEY UPDATE column='value'
    

    【讨论】:

    • 感谢@ceejayoz。那么将其与 CSV 的导入合并起来是否容易?
    【解决方案2】:

    【讨论】:

    • 感谢@bensiu。那么将其与 CSV 的导入合并起来是否容易?
    【解决方案3】:

    我在这里寻找发起人确切问题的答案,从他最后的评论/问题可以看出他正在寻找更多东西。它激发了以下解决方案。

    在脚本或批处理文件中嵌套另一个 shell 环境(例如 MYSQL)会给切换语法带来很多麻烦。我倾向于寻找在一个外壳内运行的解决方案,以减少这些并发症。我找到了这个命令字符串:

    mysqlimport --fields-terminated-by=, --ignore-lines=1 --local -uMYSQL_ACCT -pACCT_PWD YOUR_DB_NAME /PATH_TO/YOUR_TABLE_NAME.csv

    我从 Jausion 在MySQL 5.0 RefMan :: 4.5.5 mysqlimport w/Jausions Comment 的评论中得到了这个想法。简而言之,您可以通过简单地在表后命名 csv 文件并附加 .csv 扩展名来导入 csv 格式的数据库表。您可以追加到表中,甚至覆盖行。

    这是我的一项操作的真实 csv 文件内容。我喜欢制作人类可读的 csv 文件,其中包括第一行中的列标题,因此 --ignore-lines=1 选项。

    id,TdlsImgVnum,SnapDate,TdlsImgDesc,ImageAvbl

    ,12.0.3.171-090915-1,09/09/2015,增强 CHI,Y

    注意逗号是第一个字符,使第一个字段值为“NULL”。

    这是创建第二行的 linux bash 命令:

    echo null,"$LISTITEM","$IMG_DATE","$COMMENTS","$AVBL" | tee -a YOUR_TABLE_NAME.csv

    这里要知道的重要一点是,主键 id 字段的 null 字段允许应用 mysql 自动增量,然后只需将新行添加到您的表中。抱歉,不记得我是在什么地方读到这篇文章还是通过艰难的方式学到的:)

    所以,Viola!相反,对这个问题更重要的是,您可以通过提供相关行的主键来覆盖整行数据。

    我正在设计一个新表以通过覆盖操作完全满足这些要求,但正如我所提到的,我已经使用了 NULL append-a-row 自动增量选项。

    【讨论】:

    • 申请完成了,需要补充一下我所学的。覆盖一行时(指定主键行号),mysqlimport命令需要--replace选项!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2014-04-06
    • 1970-01-01
    • 2021-11-10
    • 2014-06-15
    相关资源
    最近更新 更多