我不擅长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不应该是自动递增的。
那样更好吗?
1条答案
按热度按时间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
标识符作为主键,而不是自动校正的整数:是。