2017-08-23 28 views
-1

auto_increment idを持つMSSQLテーブルがあります。今度は、この形式の作成日を含むunique unique itemID(bigint)が必要です。yyyymmdd ###Datetimeを含む自動生成された一意のIdの実装方法

最初のitemIDは20170823001、2017082300nです。 日が変更された場合は、1:201708240001

現在はC#アプリケーションでSELECT MAX(itemID)その日に追加されたアイテム)をC#コードで返します。

しかし、これはwebapi上で実行されており、2つの異なるクエリがMAX(itemID)に対して同じ結果を得て、同じ新しいitemIDを生成する可能性があります。少なくとも1つのクライアントに対して例外が発生します。

私はこれを重複を避けるためにSQLサーバーに直接実装しようとしています。

+0

お困りですか? –

+0

これは[XY問題](http://xyproblem.info)のようです。このユニークなIDは何のために必要ですか?そして、なぜその特定のフォーマットと動作を持たなければならないのですか? – InBetween

+0

Ah sry、タイトルのとおり:私はauto_incrementのようなものを探していますが、この特定のフォーマットです。 SQLサーバがINSERT INTOでジョブを実行する可能性もあります – emuuu

答えて

0

identityに組み込まれているため、パーティションの一意のIDを生成することは容易ではありません。代替案がありますが、以下は実装が非常に簡単で、並行性環境で動作します。

テーブルの構造は次のとおりです。SQL Serverはその値を処理しているよう

IF OBJECT_ID('[dbo].[DataSource]') IS NOT NULL 
BEGIN; 
    DROP TABLE [dbo].[DataSource]; 
END; 

CREATE TABLE [dbo].[DataSource] 
(
    [RecordID] INT PRIMARY KEY IDENTITY (1,1) 
    ,[DateAdded] DATE CONSTRAINT DF_DataSource_DateAdded DEFAULT (GETUTCDATE()) 
    ,[value] NVARCHAR(128) 
); 

[RecordID]は常に一意になります。値が挿入されるときを知るために、[DateAdded]列があります。この場合は、[value]の列のみを設定する必要があります。

のは、我々は次のようなデータを持っているとしましょう:

INSERT INTO [dbo].[DataSource] ([DateAdded], [value]) 
VALUES ('2017-08-23 00:00:00', 'value 01') 
     ,('2017-08-23 00:00:00', 'value 02') 
     ,('2017-08-24 00:00:00', 'value 03') 
     ,('2017-08-25 00:00:00', 'value 05') 
     ,('2017-08-25 00:00:00', 'value 06') 
     ,('2017-08-25 00:00:00', 'value 07'); 

カスタムIDカラムは次の文で、読み込み時に作成されます。

SELECT * 
    ,CONCAT(CONVERT(CHAR(8), [DateAdded],112), ROW_NUMBER() OVER (PARTITION BY [DateAdded] ORDER BY [RecordID])) AS [ID] 
FROM [dbo].[DataSource] ; 

enter image description here

はい、あなたはデータベースのcustom IDを実現させず、必要なときに毎回生成する必要がありますが、必要はありませんキーの一意性を扱うためにこれ以上心配する必要はありません。

+0

そしてこれをビューに入れると、読み取りも非常に簡単できれいになります – GuidoG

+0

上記の5のRecordIDを削除すると、生成されたIDは変わりますか? – mjwills

+0

@mjwills私は恐れるので – GuidoG

関連する問題