【问题标题】:How to re-sequence an id column after deleting a row (NOT AN AUTO-INCREMENT)删除行后如何对 id 列重新排序(不是自动增量)
【发布时间】:2010-12-12 04:24:23
【问题描述】:

我有一个表'order_item' order_item_id 整数 order_id int

主键是order_item_id + order_id

所以order_item_id和order_id都不是唯一的,但是这两列的组合是唯一的。

如果客户在他们的订单中添加多个商品,我们可以有这样的表格

order_item_id   order_id
------------------------
1                5
2                5
3                5
4                5

...如果客户随后删除 order_item_id 2 则序列中存在间隙。 order_item_id 显示供客户参考,并在我们向供应商发送采购订单时使用。

有没有办法为特定的 order_id 重新排序 order_item_id?我尝试了以下方法,但不断收到重复键错误,并且它不断将第一个找到的项目 id 更改为 0 而不是 1。

SET @i := 0;

  UPDATE order_item
     SET order_item_id = (@i := @i + 1)
   WHERE order_id = 5
ORDER BY order_id, order_item_id

感谢您的帮助。

【问题讨论】:

  • 谢谢!由于“:=”分配,我假设 Vijer 正在使用 MySql。如果 SQL Server 允许这些,我会认为我大吃一惊!

标签: sql mysql sequence


【解决方案1】:

只是不要在排序时混淆 id 和 numbers,你就不会有问题。后者甚至可以在客户端轻松完成。更改主键是一个非常糟糕的主意。

【讨论】:

    【解决方案2】:

    添加到newtover的评论:

    仅出于显示目的而更改行的主键是一个非常的坏主意。您始终可以在客户端即时生成“行号”。

    如果您需要在数据库端执行此操作,您可以在检索期间执行此操作。无需更改主键。

    不幸的是 MySQL 不支持 row_number() 函数,但可以使用以下“hack”来解决这个问题:

    选择 @rownum := @rownum + 1 作为 order_item_sequence, o.order_item_id, o.order_id, 从 order_table o, (SELECT @rownum := 0) r 其中o.order_id = 42;

    【讨论】:

      【解决方案3】:

      您只能对那些大于刚刚删除的 order_item_id 的 order_item_id 执行此操作。

      第一个set @i := deleted_order_item_id - 1;

      并添加类似where order_item_id > deleted_order_item_id 的 where 子句 并使用order_item_id = (@i := @i + 1)递增

      【讨论】:

      • 像这样修改,我仍然收到重复键错误。 order_item_id 每次都设置为 0。
        SET @i := 3 - 1;更新 order_item SET order_item_id = (@i := @i + 1) WHERE order_id = 7 AND order_item_id > 3
      • 我不确定,但我认为 (@i := @i + 1) 返回 0。也许你不能那样做?我不知道。这是哪个数据库?
      • 查询很好,但我使用 SQLyog 编辑和执行查询,然后再将它们合并到 PHP 中,显然 SQLyog 没有同时执行这两个语句,所以 @i 没有设置,也没有递增。
      【解决方案4】:

      实际上使用hartihski的建议修改后的代码是可行的,但是SQLyog执行查询肯定有问题。当我使用 phpMyAdmin 执行查询时,它按预期工作。

      【讨论】:

      • 实际上这段代码在 MyPHPAdmin 中完美运行,只是在 SQLyog.SET @i := 0; UPDATE order_item SET order_item_id = (@i := @i + 1) WHERE order_id = 7
      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 2017-08-31
      • 2019-09-05
      • 1970-01-01
      • 2015-09-28
      • 2016-03-19
      • 1970-01-01
      • 2014-01-09
      相关资源
      最近更新 更多