mysql> select * from bookCategory;
+----+--------------+-----+-----+
| id | name         | lft | rgt |
+----+--------------+-----+-----+
| 1  | 网上书城     |   1 |  22 |
| 10 | Linux        |  17 |  18 |
| 11 | Android      |  19 |  20 |
| 2  | 程序语言     |   2 |   7 |
| 3  | java         |   3 |   4 |
| 4  | VC           |   5 |   6 |
| 5  | 基础书籍     |   8 |  13 |
| 6  | 微软office   |   9 |  10 |
| 7  | 数据结构     |  11 |  12 |
| 8  | 操作系统     |  14 |  21 |
| 9  | Windows      |  15 |  16 |
+----+--------------+-----+-----+
11 rows in set (0.00 sec)mysql> update bookCategory set lft=lft+2 where lft>10;
这条语句根本没有重复值得可能,为什么会爆这个错误?
ERROR 1062 (23000): Duplicate entry '19' for key 'lft'
mysql> desc bookCategory;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | varchar(40) | NO   | PRI | NULL    |       |
| name  | varchar(40) | NO   |     | NULL    |       |
| lft   | int(11)     | NO   | UNI | NULL    |       |
| rgt   | int(11)     | NO   | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
4 rows in set (0.06 sec)

解决方案 »

  1.   


    粗看好像不会报错。但是仔细看,发现还是有报错的因素,因为你是单个update语句,你想对于大于10的数据,比如15,那么加上2,就是17,就会与已存在的17冲突,为什么呢?当15改为17时,并不是说17就改成了19,而是一个一个修改的,这样就会出现重复
      

  2.   


    非常感谢,解决了我的疑问。那么这个问题有什么好的解决办法吗?我只想到了将lft和rgt去掉unique约束了。还有其他办法吗?
      

  3.   


    非常感谢,解决了我的疑问。那么这个问题有什么好的解决办法吗?我只想到了将lft和rgt去掉unique约束了。还有其他办法吗?还有一个思路,就是每次更新一条数据,从大的开始,比如19,那就是21,然后接下来更新17,那就是19,不过这样太麻烦了。
      

  4.   

    感谢yupeigu ,但是我怎么没办法结贴给你啊?总是说我的分数分配不对