sql >> データベース >  >> RDS >> Sqlserver

SQL でのカスタム主キー値の増分

    質問の解決策を提示する前に、あなたの質問に関するいくつかのポイント:

    <オール>
  1. カスタム主キーは主に、日付 (140102)、取引が行われる物理的な場所 (entityID)、4 桁の数字 (9999) の 3 つの部分で構成されます。
  2. 単一の物理的な場所での単一の日付の設計によると、9999 を超える取引はできません。My Solution にも同じ制限が含まれます。
  3. 私の解決策のポイント

    <オール>
  4. 4 桁の数字は日付に結び付けられます。つまり、新しい日付のカウントは 0000 から始まります。例:GI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000
  5. いずれにせよ、このフィールドは一意になります。

    <オール>
  6. このソリューションは、レコードの最新の日付を現在の日付と比較します。ロジック:現在の日付とレコードの最新の日付が一致する場合、現在の日付とレコードの最新の日付が一致する場合、値を 1 だけ 4 桁増やします。一致しません。値 0000 で 4 桁の数字を設定します。
  7. 解決策:(以下のコードは、次の GoodsInwardId となる値を提供します。ソリューションに適合するように要件に従って使用してください)

    declare @previous nvarchar(30);
    declare @today nvarchar(30);
    declare @newID nvarchar(30);
    select @previous=substring(max(GoodsInwardId),4,6) from SC_TD_GoodsInward;
    Select @today=RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
    +RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2);
    
    if @[email protected]
    BEGIN
    Select @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
    +RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
    +'_'+CONVERT(varchar,1)+'_'+(SELECT RIGHT('0000'+
    CONVERT(VARCHAR,CONVERT(INT,RIGHT(MAX(GoodsInwardId),4))+1),4) 
    from SC_TD_GoodsInward);
    END
    else
    BEGIN
    SET @newID='GI_'+RIGHT('00'+CONVERT(varchar,datepart(YY,getdate())),2)
    +RIGHT('00'+CONVERT(varchar,datepart(MM,getdate())),2)+RIGHT('00'+CONVERT(varchar,datepart(DD,getdate())),2)
    +'_'+CONVERT(varchar,1)+'_0000';
    END
    select @newID;
    

    必要な構造を作成するための T-SQL (推測)

    テーブルの場合:

    CREATE TABLE [dbo].[SC_TD_GoodsInward](
        [EntityId] [int] NULL,
        [GoodsInwardId] [nvarchar](30) NULL
    )
    

    テーブルのサンプル レコード:

    insert into dbo.SC_TD_GoodsInward values(1,'GI_140102_1_0000');
    insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_9999');
    insert into dbo.SC_TD_GoodsInward values(1,'GI_140101_1_0001');
    

    **あなたの状況では考えられる解決策ですが、完全な解決策は ID 列 (必要に応じて再シードを使用) を持ち、それを現在の日付と計算列として関連付けることです。



    1. 解析エラー:構文エラー、予期しない''(T_ENCAPSED_AND_WHITESPACE)

    2. Pythonで、UNIXタイムスタンプがある場合、それをMySQL日時フィールドに挿入するにはどうすればよいですか?

    3. LINQまたは他のORMのないリポジトリパターン?

    4. ファイルから変数への読み取り-Bashスクリプトtake2