2

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

多亏了这里的建议,我使用 CGI 和 DBI 模块设置了一些我已经成功写入和通过 Perl 脚本访问的表。

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

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

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

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

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

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

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

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

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

我的石刀方法可能对这里的大师们来说是可笑的,但是,我需要从某个地方开始。

提前感谢你的帮助。

4

2 回答 2

1

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

于 2010-10-22T12:30:44.713 回答
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';

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

于 2010-10-22T14:07:53.983 回答