其中一个主表,我们称之为“tableData'”,存储所有主要数据并有2个主键。第一个主键是一个自动增量整数。第二个主键是submission_num,它以这种格式存储varchar值(rep / yyyy / A.I.integer,例如rep / 2017/00021,rep / 2017/00023,rep / 2016/02345)
当需要将数据提交到tableData时,php将检索submission_num的最大数量并将其增加1,然后使用新的submission_num将新数据插入tableData。 (例如,如果php接收rep / 2017/00034作为最大数量,它将整数部分增加1,这将导致新的提交数量num / 2017/00035,然后使用新提交的内容存储新数据NUM)
PHP脚本的算法看起来像这样
获取最大submission_num,
查询: SELECT submission_num FROM tableData WHERE substr(submission_num,5,4)=' $ curYear' ORDER BY submission_num DESC LIMIT 0,1
将整数部分增加1
这种方法造成了问题。当两个或更多用户点击“提交”时按钮在合适的时刻。它们将生成相同的提交num并以重复的提交num保存到数据库(此提交num必须是唯一的)
有没有办法可以从PHP脚本的任何Select查询暂时锁定表?
答案 0 :(得分:0)
表只有一个主键约束,它可以有多个唯一约束。现在把肥皂盒放在一边。
您遇到了麻烦,因为submission_num
代表了表格的3个不同属性。因为您想在插入行时计算第3个属性(给定行集上的子序列),所以会出现并发问题,导致您询问有关锁定表的问题。
您应该做的是将表格模型化为现实,并将submission_num
的第一个组件存储为某种类型的代码列,并将第二个组件存储为insert_date列。
然后你可以计算第3个"子属性"稍后当你查询表时。这样你不就必须锁定表,这是面向应用程序的用户永远不应该做的事情。
附录1
您可以在新表(包括附加的year_submission_num列)中进行更改,为插入日期小于01-JAN-2017的行填充year_submission_num,然后创建一个视图,该视图是两个集合A和乙
集合A是year_submission_num不为null的行集合,您可以在其中定义投影列C,它是当前值的串联。
集合B是一组行,其中year_submission_num为null,在其中编写更复杂的子查询以生成C.
然后每天运行一次批处理作业来更新year_submission_num,它当前为null。这样,"更复杂的子查询"不太贵。
如果您完成所有 ,那么您将不必更改您的网页。
答案 1 :(得分:-1)
我不知道某个查询是否可以解决这个问题,但我有一个简单的方法。将整数部分增加1后,可以再次进行检查,如果没有第二个主键,则可以存储数据。如果结果有第二个主键,则可以再次将整数部分增加1。是的,你需要循环过程进行此检查