我正在使用MySQL,我没有办法做到这一点。
我有一个位置为field
的表,我需要跟踪其值为1到10,000。
假设我在第5000个位置的中间插入一条记录。因此需要将位置5000到10,000更新到新位置;老5000变成5001,5002变成5003 ......
当添加1个单一位置时,是否有一种很好的方法可以在不影响这么多记录的情况下实现它?
从第1位添加是最糟糕的。
答案 0 :(得分:5)
我重新考虑数据库设计。如果你将被限制在10K记录的数量级,那么它也不会太糟糕,但如果这种情况不受限制地增加那么你就会想要做其他事情。我不确定你在做什么,但如果你想要一个简单的排序(假设你没有进行大量的遍历)那么你可以有一个prev_id
和next_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;