mysql插入id在set range(或下一个可用id)之间的值

igetnqfo  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(285)

让我解释一下我的数据结构。
此特定表将用于组织网站的类别/子类别树。

如您所见,主类别(没有任何父类别的类别)将被分配ID为1到99。
同时,子类别将被分配一个以父类别的id开头的id。例如,属于类别1的所有子类别的id将从101到199;属于类别2的所有子类别的id都是201到299,以此类推。
问题是:我能告诉mysql在ids101和199之间的下一个可用的“slot”上“insert value1,value2,value3”吗?
如中所示,如果存在使用ids 102103104插入的行(如上图所示)。如果我说“insert between 101 and 199”,mysql会自动插入下一行id为105的内容。
如果mysql或mysql过程无法实现,那么可以用php中的函数来实现吗(检索所有值,做一些数学运算,然后插入数据)。
如果不遵循这个特定的规则(因为表结构也使用父\ id),那么这个规则不会破坏网站,它的存在只是为了使数据库更易于阅读,并使人们阅读或组织数据时不那么混乱。
先谢谢你。

jgovgodb

jgovgodb1#

作为初学者:我不建议这样做。代理主键本身不应具有特定的功能含义;它只是用来唯一地标识一个记录,并可能作为外键的引用。我还要指出,您的系统伸缩性不好,因为它不能支持9个以上的根类别(或给定类别的99个子类别,以此类推)。
这就是说:你所要求的在技术上是可行的,但它需要对每一张table进行额外的扫描 insert :

insert into mytable (category_id, parent_id, category_name, category_description)
select coalesce(max(category_id), 100) + 1, 1, 'Cat 1 Sub N', 'Cat1 Sub N'
from mytable
where category_id >= 101 and category_id < 200
having max(category_id) is null or max(category_id) < 199

技术在于使用 insert ... select ... 语法,以及获取给定范围的高水位线的聚合查询。如果范围为空,则指定一个与范围开头相对应的默认值。如果范围已满,则 insert 未形成。

相关问题