【问题标题】:Sql server increasing order id manuallySql server 手动增加订单id
【发布时间】:2015-02-02 12:00:40
【问题描述】:
id name order
1   a     102
2   b     103
3   c     104
4   d     105
5   e     106
6   f     107
7   g     108
8   h     109
9   i     110

上面显示像“order by order ASC” 列 id 是主键,自动递增 1 列名是 varchar 列顺序是一个整数

我想更新指定行的订单号。 例如,我想将 id 9 移动到第一个订单 (102) 并希望为它更改所有其他 id 的订单号。

有没有办法在 ms sql 中以编程方式进行?

这是针对我网站的产品页面的。 我想订购我想要的产品....

编辑:对不起,这是我第一次,我想解释更多。

首先,为了删除主键,我不想更改主键。 我只是想更改他们的订单ID,在上面的例子中,我想将“id=9”的“订单”更改为102,然后其他需要从103,104,105等跟进。

结果将是...

id name order
9   i     **102**
1   a     **103**
2   b     **104**
3   c     **105**
4   d     **106**
5   e     **107**
6   f     **108**
7   g     **109**
8   h     **110**

【问题讨论】:

  • 请举例说明结果应该是怎样的
  • 这个问题很模糊,我不确定他们在追求什么。但是,更新密钥通常是一个非常糟糕的设计。
  • 我编辑了我的问题...

标签: c# asp.net sql-server


【解决方案1】:

我认为你不应该弄乱一行的 id(主键)。它应该是不可变的

如果您需要自定义排序,添加一个新列就足够了

ALTER TABLE dbo.MYTABLENAME ADD
    Sort int NOT NULL CONSTRAINT DF_tmp_Sort DEFAULT 0
GO

所以你可以按它排序并随意改变它

问题编辑后更新:

好的,现在我明白你的要求了:

SELECT *
FROM   dbo.MYTABLENAME
ORDER BY CASE WHEN ID = 9 THEN 0
              ELSE ID END ASC

进一步(希望最后)更新

您只需要 2 个简单的更新:

UPDATE dbo.MYTABLENAME SET order=order+1 WHERE order>=102;
UPDATE dbo.MYTABLENAME SET order=102 WHERE id=9;

【讨论】:

  • 谢谢@giammin,我编辑了问题来解释更多,请再次检查。
  • 再次感谢您,但您误会我我不想选择,我想像结果表一样“更新”。
【解决方案2】:

要重新排列数据以使 9 从 102 开始,并将 102 之后的所有内容更改为现在从 103 开始​​,请使用以下命令:

UPDATE SomeTable SET [Order] = [Order] + 1 WHERE [Order] >= 102;
UPDATE SomeTable SET [Order] = 102 WHERE ID = 9

SomeTable 是您的表名

【讨论】:

  • 这很好,但我想知道 OP 是否需要在 ID 9 之后留下任何东西。就像如果有一行 ID 10 和订单 111 那么你不需要增加它的订单。
  • @juharr 好吧,我希望所有行都需要重新洗牌。但我想知道 5000 行是否有任何性能问题?有没有办法变得更聪明?
  • @MehmetBuluş 它可能会更高效,但我怀疑你会注意到只有 5,000 行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
相关资源
最近更新 更多