【问题标题】:MYSQL Insert values with ID between set range (or next available ID)MYSQL 在设置范围(或下一个可用 ID)之间插入 ID 值
【发布时间】:2020-10-05 09:04:04
【问题描述】:

让我解释一下我的数据结构。

此特定表将用于组织网站的类别/子类别树。

如您所见,主要类别(没有任何父类别的类别)将被分配 1 到 99 的 ID。

同时,将为子类别分配一个以父 ID 开头的 ID。例如,属于类别 1 的所有子类别的 ID 都是从 101 到 199;属于类别 2 的所有子类别的 ID 都是从 201 到 299,依此类推。

问题如下:我可以告诉 MYSQL 在 ID 101 和 199 之间的下一个可用“槽”上“插入 value1、value2、value3”吗?

如中,如果存在 ID 为 102,102,103,104 的行插入(如上图所示)。如果我说“在 101 和 199 之间插入”,MYSQL 会自动插入 ID 为 105 的下一行。

如果使用 MYSQL 或 MYSQL 过程无法实现,是否可以使用 PHP 中的函数来代替? (检索所有值,做一些数学运算,然后插入数据)。

如果不遵循此特定规则,则不会破坏网站(因为表结构也使用 parent_id),但存在的唯一目的是使数据库具有可读性,并使人们阅读或组织数据时不那么混乱。

提前谢谢你。

【问题讨论】:

  • 在 100 和 199 之间获取最大的 id,并为每列输入一个。

标签: php mysql sql select sql-insert


【解决方案1】:

作为初学者:我不建议这样做。代理主键本身不应具有特定的功能含义;它只是用来唯一标识一条记录,并可能用作外键的参考。我还要指出您的系统无法很好地扩展,因为它不能支持超过 9 个根类别(或给定类别的超过 99 个子类别,等等)。

也就是说:您所要求的在技术上是可行的 - 但它需要对每个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

【讨论】:

  • 就像我提到的那样,以这种方式构建的 ID 不是功能决定,这是因为组织数据库的人想要“人类可读性”的元素。如果您超过 9 个类别,那么您的子类别将从 ID 1001 开始为类别 10。
猜你喜欢
  • 2010-10-31
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-21
  • 1970-01-01
  • 2021-05-17
  • 2010-11-27
相关资源
最近更新 更多