【问题标题】:CakePHP saveAll() w/ unique constraint带有唯一约束的 CakePHP saveAll()
【发布时间】:2013-08-07 04:49:46
【问题描述】:

我正在开发一个应用程序,用户将从文本文件中导入几千条记录。我对表中的 3 列有唯一约束,但是当我尝试导入重复记录时收到此错误。

Error: SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '2013-06-01 15:25:41-2013-06-01 15:25:42-null' for key 'start_time'

看起来一旦由于违反约束而导致插入失败,CakePHP 将停止尝试插入数据。有什么方法可以让 CakePHP 忽略约束冲突?

感谢您的宝贵时间。

【问题讨论】:

  • 在您的数据库中配置了约束,cakephp 无法忽略或其他东西。如果您希望能够插入,则需要删除数据库中的约束。
  • 或者,如果可能,尽量不要将重复项插入到唯一字段中。结局不会很好
  • 您是否尝试过使用 TRY CATCH 逐一插入行?接受的答案是一种不好的方法。
  • 我试过了,它可以工作,但速度太慢了。一些导入的文件包含 50000+ 行。

标签: php mysql cakephp


【解决方案1】:

这实际上取决于您导入数据的方式以及您使用的 RDBMS。

如果您在文本文件上逐行循环并在每行之后插入数据,则可以捕获异常并转到文本文件的下一行。请记住将失败的行推送到某种错误日志中,这样您就可以找到哪些插入失败了。我看到的更大问题是抛出的异常可能会破坏您当前的事务,对于大量数据插入,您肯定希望将所有内容包装在单个事务中以获得最佳性能。

如果您使用的是 MySQL 和 CSV 文件,可以使用 LOAD DATA INFILE 命令进行探索。

【讨论】:

    【解决方案2】:

    问题是我们一次要导入数千条记录。在尝试插入之前检查一行是否存在(我相信这就是 CakePHP 的独特验证的工作方式)如果我要尝试逐行保存它,那么查询量会增加一倍。我将删除列上的唯一约束并插入所有行。插入新行后,我将向这些列添加唯一约束,然后删除约束。我认为这对我来说效果很好,因为我们计划每月只导入一次新记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-12
      • 2021-11-05
      • 1970-01-01
      • 2013-03-15
      • 2021-09-30
      • 2010-10-17
      • 2021-05-22
      • 1970-01-01
      相关资源
      最近更新 更多