将记录插入到具有位置的表中,而不更新所有记录位置字段

时间:2012-05-15 05:05:14

标签: mysql algorithm

我正在使用MySQL,我没有办法做到这一点。

我有一个位置为field的表,我需要跟踪其值为1到10,000。

假设我在第5000个位置的中间插入一条记录。因此需要将位置5000到10,000更新到新位置;老5000变成5001,5002变成5003 ......

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

从第1位添加是最糟糕的。

2 个答案:

答案 0 :(得分:5)

我重新考虑数据库设计。如果你将被限制在10K记录的数量级,那么它也不会太糟糕,但如果这种情况不受限制地增加那么你就会想要做其他事情。我不确定你在做什么,但如果你想要一个简单的排序(假设你没有进行大量的遍历)那么你可以有一个prev_idnext_id列来表示兄弟关系。以下是您的问题的答案:

update some_table 
set some_position = some_position + 1
where some_position > 5000 and some_position < 10000

答案 1 :(得分: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;