使用php递归更新mysql的最佳方法是什么

jexiocij  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(381)

我不擅长php和mysql,但我知道一些,我的问题是,我想更新一个200万行(在未来,但现在我只有很少的数据)。

1

我有这张table:

ID   BAnumber  DateEntry    Parent   Side  LastA  LastB
1   10001    01-01-2018                                             03-02-2018
2   10002    01-13-2018        9055       B
3   10003    01-15-2018       10001      A  03-02-2018
4   10004    01-20-2018       10002      B
5   10005    02-05-2018       10003      A  03-02-2018
6   10006    03-02-2018       10005      A

我将插入第7行

7   10008    03-20-2018       10005      B

行7在其b侧连接到父级10005,而行6在a侧连接,
在插入第7行之后,我想将它的父级(10005)last day(side b)更新为新创建的dateentry,并用相同的日期更新它的父级(10005)(父级10003 side a)lasta。这会反复进行,直到第一个数据没有父数据为止

ID   BAnumber  DateEntry    Parent   Side  LastA  LastB
1   10001    01-01-2018                                             03-23-2018
2   10002    01-13-2018        9055       A
3   10003    01-15-2018       10001      B    03-23-2018
4   10004    01-20-2018       10002      B
5   10005    02-05-2018       10003      A    03-02-2018  03-23-2018
6   10006    03-02-2018       10005      A
7   10008    03-23-2018       10005      B

我可以通过php实现:

1. insert row 7,
2. search parent and side of row 7
3. update row 5
4. search parent and side of row 5
5. update row 3
6. search parent and side of row 3
7. update row 1

这将在一个循环中有太多的sql查询,这在少量数据中是可以的,但是如何在大数据中优化它呢?
我的代码正在工作,但我只想优化更大的数据。
对不起,我不知道如何张贴表和代码在这里使用移动。。

2

另一个问题,我没有真正使用id列,它是pk,我应该删除它并使banumber成为主键吗?但是banumber不应该是自动递增的。
那样更好吗?

kulphzqa

kulphzqa1#

你的方法是正确的。
为什么?mysql的生产版本缺乏执行分层查询的能力(例如,选择行是nnn祖先的数据)。mysql没有内置的 WHERE P is-ancestor-of C 操作,只有 WHERE P is-parent-of C 操作实施人 WHERE P.BANumber = C.parent .
因此,您需要在循环中使用查询来执行操作。您需要为每个祖先级别运行一次查询。如果您的一些数据行包含一百万级别的祖先,那么您将运行循环一百万次。循环次数太多了(大多数层次化表示,比如物料清单——widget:case:screw——没有那么多的祖先。在现实世界的数据中,十个级别是非常重要的。)
您可能希望使用事务或表锁,以便同时尝试更新特定的祖先链不会引起混淆。
sqlserver、mariadb的最新版本和postgresql(以及其他版本)使用递归公共表表达式(您可以查找)实现分层查询。oracle使用专门的 START WITH ... CONNECT BY 此的查询语法。
但是如果你的数据有很多层次的祖先,我强烈建议你尝试用另一种方式来表示它。
至于你关于使用你独特的真实世界的问题 BANumber 标识符作为主键,而不是自动校正的整数:是。

相关问题