2

私は MySQL を使用していますが、これを行う良い方法がありません。

position を持つテーブルがあり、field1 から 10,000 までの値を追跡する必要があります。

5000 番目の位置の真ん中にレコードを挿入するとしましょう。したがって、位置 5000 から 10,000 を新しい位置に更新する必要があります。古い 5000 は 5001 になり、5002 は 5003 になります...

単一の位置が追加されたときに、非常に多くのレコードに影響を与えずにこれを実装する良い方法はありますか?

1位からの追加は最悪です。

4

2 に答える 2

5

データベースの設計を再考します。10K レコード程度に制限される場合はそれほど悪くはありませんが、これが際限なく増加する場合は、別のことを行う必要があります。あなたが何をしているのかわかりませんが、単純な順序付けが必要な場合 (多くのトラバーサルを行っていないと仮定して)、兄弟関係を示すprev_idand列を使用できます。next_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 に答える