0

我一直在寻找这个。我有一个包含以下字段的 MySQL 表:

Id  | Parent | Code  |  Name
1   |   0    | 1     |  bla
2   |   1    | 1.1   |  blabla
3   |   1    | 1.2   |  blable
4   |   3    | 1.2.1 |  blablebla
5   |   3    | 1.2.2 |  blableble
6   |   1    | 1.3   |  blabli
7   |   1    | 1.4   |  blablo
8   |   0    | 2     |  ble
9   |   0    | 3     |  bli
10  |   9    | 3.1   |  blibla

... 等等!

我想删除 ( ID 3) 并递归地重建该CODE字段,以便它继续按顺序排列。对于这个例子,我只需要选择代码等于:1.3* 1.4* 的 id

换句话说:

  1. (任何大于 2 的数字)

我怎样才能做到这一点?

所以决赛桌结束了

Id  | Parent | Code  |  Name
1   |   0    | 1     |  bla
2   |   1    | 1.1   |  blabla
6   |   1    | 1.2   |  blabli
7   |   1    | 1.3   |  blablo
8   |   0    | 2     |  ble
9   |   0    | 3     |  bli
10  |   9    | 3.1   |  blibla

对于递归删除,我使用 on delete cascade all,因为 PARENT 是 ID 的索引。但我需要手动选择所有 1.3 ... 1.* 和他们的孩子并将它们重写为 1.2 ... 1.(*-1)

先感谢您!

4

2 回答 2

0

我相信正确的正则表达式是:

^1\.[3-9]

这将匹配 1.3、1.4、1.3.1 等,但不会匹配 1.10。如果您也想捕获这些情况,请使用:

^1\.([3-9]|\d{2,})
于 2013-06-13T02:54:46.097 回答
0

这将是一种方法:

  1. 取版本号:

    1.2
    
  2. 去掉最后一个数字并转义句点:

    1\.
    
  3. 计算匹配下一个版本的字符类:

    1\.1[0-9]{2,}|1\.2[0-9]+|1\.[3-9][0-9]*
    
  4. 锚定表达式:

    ^(1\.1[0-9]{2,}|1\.2[0-9]+|1\.[3-9][0-9]*)(\.|$)
    

正如你所看到的,这个过程并不简单,但它是我能想到的最合乎逻辑的。您可能需要考虑找到将代码转换为单个数字的方法。

于 2013-06-17T02:29:49.177 回答