2

我正在使用 MySQL,我没有很好的方法来做到这一点。

我有一个带有 position 的表field,我需要跟踪它的值从 1 到 10,000。

假设我在中间第 5000 个位置插入一条记录。所以位置5000到10000需要更新到新位置;老5000变成5001,5002变成5003……

当添加 1 个单一位置时,有没有一种很好的方法可以在不影响这么多记录的情况下实现这一点?

从第一个位置添加是最糟糕的。

4

2 回答 2

5

我会重新考虑数据库设计。如果您将被限制在 10K 记录的数量级上,那还不错,但如果这将无限增加,那么您将想做其他事情。我不确定你在做什么,但如果你想要一个简单的排序(假设你没有做很多遍历),那么你可以有一个prev_idandnext_id列来指示兄弟关系。不过,这是您的问题的答案:

update some_table 
set some_position = some_position + 1
where some_position > 5000 and some_position < 10000
于 2012-05-15T05:07:39.853 回答
0
You can try the below approach :

USE tempdb;
GO

CREATE TABLE dbo.Test
(
ID int primary key clustered identity(1,1) ,
OrderNo int, 
CreatedDate datetime
);

--Insert values for testing the approach
INSERT INTO dbo.Test 
VALUES
(1, GETUTCDATE()),
(2, GETUTCDATE()),
(3, GETUTCDATE()),
(4, GETUTCDATE()),
(5, GETUTCDATE()),
(6, GETUTCDATE());

SELECT * 
FROM dbo.Test;

INSERT INTO dbo.Test 
VALUES
(3, GETUTCDATE()),
(3, GETUTCDATE());


SELECT * 
FROM dbo.Test;


--To accomplish correct order using ROW_NUMBER()
  SELECT ID, 
  OrderNo, 
  CreatedDate, 
  ROW_NUMBER() OVER(ORDER BY OrderNo, ID) AS Rno
  FROM dbo.Test;


--Again ordering change
  INSERT INTO dbo.Test 
VALUES
(3, GETUTCDATE()),
(4, GETUTCDATE());

  SELECT ID, 
  OrderNo, 
  CreatedDate, 
  ROW_NUMBER() OVER(ORDER BY OrderNo, ID) AS Rno
  FROM dbo.Test


   DROP TABLE dbo.Test;
于 2014-09-17T09:54:52.937 回答