首先,我想说的是,我正在使用 PHP 框架 Yii,所以如果可能的话,我希望保留在其定义的 SQL 语句集中。我知道我可能可以创建一个巨大的长 SQL 语句来完成所有事情,但我不想这样做。

好的,假设我有一个表 Users 和一个表 FavColors。然后我有一个表单,用户可以通过从大量可能的颜色列表中选中一个或多个复选框来选择他们的颜色偏好。

这些结果作为多行存储在 FavColors 表中,如下所示(id、user_id、color_id)。

现在想象用户进入并更改他们的颜色偏好。在这种情况下,将新的颜色首选项输入数据库的最有效方法是什么?

选项1:

  • 批量删除 user_id 匹配的所有行
  • 然后批量插入所有新行

选项2:

  • 浏览每个当前行以查看更改的内容,并进行相应更新
  • 如果需要插入更多行,请执行此操作。
  • 如果需要删除行,请执行此操作。

我喜欢选项一,因为它只需要两个语句,但是删除一行只是为了可能放回几乎完全相同的数据,感觉有点不对劲。还有一个问题是让 ids 更快地自动递增到更高的值,我不知道是否应该尽可能避免这种情况。

选项 2 将需要更多的编程工作,但可以防止我删除一行只是为了再次创建它的情况。然而,在 PHP 中增加更多负载可能不值得减少 MySQL 的负载。

有什么想法吗?你们都会做什么?

有帮助吗?

解决方案

UPDATE 到目前为止要快得多。当你 UPDATE, ,表记录刚刚被新数据重写。所有这一切都必须在 INSERT.

当你 DELETE, ,索引应该更新(记住,您删除整行,而不仅仅是需要修改的列)并且数据块可能会被移动(如果您点击 PCTFREE 限制)。还可以删除和添加新的更改记录 ID 上的 auto_increment,因此如果这些记录具有会被破坏的关系,或者也需要更新。我会去 UPDATE.

这就是为什么你应该更喜欢 INSERT ... ON DUPLICATE KEY UPDATE 代替 REPLACE.

前一个是一个 UPDATE 关键违规时的操作,而后者是 DELETE / INSERT

更新: 这是一个例子 INSERT INTO table (a,b,c) VALUES (1,2,3) ON DUPLICATE KEY UPDATE c=c+1;

欲了解更多详情,请阅读更新 文档

其他提示

菲利普,您是否尝试过做准备的陈述?使用准备好的语句,您可以使用不同的参数对一个查询进行批处理并多次调用它。在循环结束时,您可以以最小的网络延迟执行所有这些循环。我已经在 php 中使用了准备好的语句,效果很好。比 java 准备好的语句更令人困惑。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top