Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将记录插入到具有位置的表中,而不更新所有记录位置字段_Mysql_Algorithm - Fatal编程技术网

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

Mysql 将记录插入到具有位置的表中,而不更新所有记录位置字段,mysql,algorithm,Mysql,Algorithm,我正在使用MySQL,我没有一个好的方法来做到这一点 我有一个表,其中有一个位置字段,我需要跟踪它的值从1到10000 我们把中间的一个记录插入到第五千位。因此,5000至10000个职位需要更新为新职位;旧5000变成5001,5002变成5003 当添加一个位置时,有没有一种好方法可以在不影响这么多记录的情况下实现这一点 从第1位开始添加是最糟糕的 我会重新考虑数据库设计。如果你将被限制在10K记录的数量级上,那也不算太糟糕,但是如果这将不受限制地增加,那么你会想做些别的事情。我不知道你在做

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

我有一个表,其中有一个位置
字段
,我需要跟踪它的值从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;