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)
+----+--------------+-----+-----+
| 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)
粗看好像不会报错。但是仔细看,发现还是有报错的因素,因为你是单个update语句,你想对于大于10的数据,比如15,那么加上2,就是17,就会与已存在的17冲突,为什么呢?当15改为17时,并不是说17就改成了19,而是一个一个修改的,这样就会出现重复
非常感谢,解决了我的疑问。那么这个问题有什么好的解决办法吗?我只想到了将lft和rgt去掉unique约束了。还有其他办法吗?
非常感谢,解决了我的疑问。那么这个问题有什么好的解决办法吗?我只想到了将lft和rgt去掉unique约束了。还有其他办法吗?还有一个思路,就是每次更新一条数据,从大的开始,比如19,那就是21,然后接下来更新17,那就是19,不过这样太麻烦了。