Mysql 将记录插入到具有位置的表中,而不更新所有记录位置字段
我正在使用MySQL,我没有一个好的方法来做到这一点 我有一个表,其中有一个位置Mysql 将记录插入到具有位置的表中,而不更新所有记录位置字段,mysql,algorithm,Mysql,Algorithm,我正在使用MySQL,我没有一个好的方法来做到这一点 我有一个表,其中有一个位置字段,我需要跟踪它的值从1到10000 我们把中间的一个记录插入到第五千位。因此,5000至10000个职位需要更新为新职位;旧5000变成5001,5002变成5003 当添加一个位置时,有没有一种好方法可以在不影响这么多记录的情况下实现这一点 从第1位开始添加是最糟糕的 我会重新考虑数据库设计。如果你将被限制在10K记录的数量级上,那也不算太糟糕,但是如果这将不受限制地增加,那么你会想做些别的事情。我不知道你在做
字段
,我需要跟踪它的值从1到10000
我们把中间的一个记录插入到第五千位。因此,5000至10000个职位需要更新为新职位;旧5000变成5001,5002变成5003
当添加一个位置时,有没有一种好方法可以在不影响这么多记录的情况下实现这一点
从第1位开始添加是最糟糕的 我会重新考虑数据库设计。如果你将被限制在10K记录的数量级上,那也不算太糟糕,但是如果这将不受限制地增加,那么你会想做些别的事情。我不知道你在做什么,但是如果你想要一个简单的排序(假设你没有做很多遍历),那么你可以有一个
prev\u id
和next\u id
列来指示兄弟关系。以下是您的问题的答案:
update some_table
set some_position = some_position + 1
where some_position > 5000 and some_position < 10000
更新一些表
设置一些位置=一些位置+1
其中有些位置>5000,有些位置<10000
FYI,这是一个糟糕的数据库设计。是的,我同意。你会怎么做?不确定你的最终目标是什么,我在下面的回答中添加了一个假设的例子。类似于:我喜欢这种订单管理的上一个id,下一个id设计。谢谢@Abdullah@AbdullahJibaly只是好奇,对于下一个/上一个id,在选择数据时是如何工作的,按什么排序?@Abdullah Jibaly,谢谢。我也喜欢下一个/上一个id,同样的问题,我们如何选择数据?@Maulik Vora我在这里找到了一些答案。
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;