【问题标题】:Perl MySQL - How do I skip updating or inserting a row if a particular field matches?Perl MySQL - 如果特定字段匹配,我如何跳过更新或插入行?
【发布时间】:2010-10-22 22:07:53
【问题描述】:

我对此很陌生,很抱歉我缺乏知识。

感谢此处的建议,我使用 CGI 和 DBI 模块设置了一些已成功写入并通过 Perl 脚本访问的表。

这是本地乐队通讯的成员列表。是的,我知道,有大量的应用程序,但是,我想学习这个。

1- 如果我的输入与某个特定列/字段中的列数据匹配,我想避免更新或插入一行。

创建表时,在 phpmyadmin 中,我在结构视图中单击了该列名称上的“U”(唯一)。 这似乎可行,并且没有插入任何欺骗,但是,我想要一个硬编码的 Perl 解决方案,所以我理解它的机制。

我阅读了“插入忽略”/“更新忽略”并搜索了所有内容,但是,我发现的所有内容似乎不仅仅是跳过了一个骗局。

该列不是键或 autoinc 只是带有电子邮件地址的普通旧字段。 (错误?)

2- 当我写入数据库时​​,如果传入的电子邮件地址与该字段中的一个匹配,我不想做任何事情。

我想要最快的方法,这样我就可以遍历他们现有的列表导出数据,(他们无法弄清楚软件)没有赛车/锁定问题或任何我明显无知的情况。

由于我是从头开始创建的,因此 1 和 2 实际上可能部分没有实际意义。如果是这样,最好的方法是什么?

我仍然想要一个自动递增的 ID,所以我可以通过 ID 号访问或使用某种 count++ foreach 循环访问。

我的石刀方法可能会让这里的大师们感到可笑,但是,我需要从某个地方开始。

提前感谢您的帮助。

【问题讨论】:

    标签: mysql perl duplicate-data


    【解决方案1】:

    使用声明为 UNIQUE 的电子邮件地址列,INSERT IGNORE 正是您想要插入的内容。听起来您已经知道如何做正确的事了!

    (您可以在 perl 中执行“如果它已经存在则不插入”功能,但很难做到正确,因为您必须将测试和更新包装在事务中。关系的一大优势数据库是它会为你执行这样的约束检查,即使你的应用程序有问题也能确保数据的完整性。)

    对于更新,我不确定“更新忽略”会是什么样子。 WHERE 子句中有什么限制您的 UPDATE 只影响 1 所需的行?也许你提到的那个 auto_increment 主键?例如,如果你想写,

    UPDATE members SET firstname='Sue' WHERE member_id = 5;
    

    那么我认为你想要的这个“更新忽略”功能可能就是这样的

    UPDATE members SET firstname='Sue' WHERE member_id = 5
        AND email != 'sue@example.com';
    

    这是一件很奇怪的事情,但这是我对你的意思的最佳猜测:)

    【讨论】:

      【解决方案2】:

      只需进行插入,如果数据会使唯一列不唯一,您将收到 SQL 错误,您应该能够捕获此错误并执行任何适当的操作(例如,忽略它、记录它、提醒用户.. .)

      【讨论】:

        猜你喜欢
        • 2020-01-15
        • 1970-01-01
        • 1970-01-01
        • 2018-05-24
        • 1970-01-01
        • 2014-08-12
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        相关资源
        最近更新 更多