代码之家  ›  专栏  ›  技术社区  ›  lightning_missile

使用唯一列执行sql批插入/更新时,保持数据的完整性和一致性

  •  0
  • lightning_missile  · 技术社区  · 8 年前

    我有一个excel文件,下载时包含数据库中的内容。每一行都使用一个名为id\u number的标识符进行标识。用户可以使用新的唯一id\u号在文件上添加新行。上传时,对于每个excel行,

    • 当数据库上存在id\u号时,将对数据库行执行更新。
    • 当数据库上不存在id\u号时,将在数据库行上执行插入。

    除excel文件外,还可以使用名为“报告”的文件单独添加或更新数据。php。例如,如果用户只想为员工添加一个数据,则使用此页面。

    理想情况下,我想做一个插入。。。重复密钥更新以获得最佳性能。我也可以把它们全部放在一个交易中。然而,我认为这个整体过程有一些缺陷:

    • 在任何添加/更新之前,必须对所有excel行及其对应的数据库行进行验证检查。原因是表中有许多独特的列。这就是为什么在执行任何添加/更新之前,我必须执行一些select语句以确保数据有效。这对500行69列的表有效吗?我可能只需要获取所有数据并将其存储在一个php数组中,然后对该数组进行验证检查,但如果有人在报告中添加一个新行(id\u数为5),会发生什么情况呢。php?那么假设我上传的excel文件也包含一个id\u编号为5的行?这可能会破坏我的验证,因为如果不执行大量select语句,我无法确保我的数据是最新的。
    • 假设系统正在添加/更新从excel文件检索到的数据,然后是来自报告的某个人。php添加了一行,因为所有验证都已满足(例如,没有重复的id\u编号)。假设此时excel文件中要添加的下一行和用户将在报告中添加的行。php具有相同的id_编号。然后会发生什么?我对事务不太了解,我认为它们至少可以防止两个查询同时更改一行?是这样吗?

    我真的不太介意这种情况。但有些文件有许多行,处理所有行可能需要很长时间。

    我想解决这个问题的一种方法是:在处理excel文件上传时,我必须防止用户使用报表。php修改excel文件当前保存的行。这样可以吗?

    1 回复  |  直到 8 年前
        1
  •  2
  •   Jeff Richards    8 年前

    真的需要 为了允许用户生成自己的唯一ID,您可以在验证和插入时锁定有问题的表。

    如果您获得了写锁,那么可以确定在执行验证和插入工作时表没有更改。

    `mysql> LOCK TABLES tbl_name WRITE`
    

    别忘了

    `mysql> UNLOCK TABLES;`
    

    锁定的缺点很明显,表被锁定。如果是高流量,那么你所有的流量都在等待,这可能会带来各种各样的痛苦(mysql没有连接,这是一个常见的问题)

    也就是说, 总之,让mysql成为唯一一个生成唯一id的人。也就是说,确保数据库表具有一个自动递增的唯一id(主键),然后在电子表格中输入新记录,而不使用给定的唯一id。然后mysql将确保新记录获得唯一的id,您不必担心锁定,并且可以验证和插入,而无需担心冲突。

    关于500条记录69列表的性能问题,我只能说,如果php服务器和mysql服务器的大小合理,并且这些列不是大数据类型,那么这些数据量应该在几分之一秒内就可以轻松处理。也就是说,性能可能会被一行糟糕的代码破坏,所以如果您的代码执行速度慢,我会将其视为一个单独的优化问题。