sql >> Database >  >> RDS >> Sqlserver

Aangepaste primaire sleutelwaarden verhogen in SQL

Voordat u een oplossing voor de vraag geeft, enkele punten op uw vraag:

  1. Omdat de aangepaste primaire sleutel hoofdzakelijk uit drie delen bestaat:Datum(140102), fysieke locatie waar de transactie plaatsvindt (entityID), nummer van 4 plaatsen (9999).
  2. Volgens het ontwerp kunnen er op één datum op één fysieke locatie niet meer dan 9999 transacties zijn -- My Solution zal ook dezelfde beperking bevatten.

Enkele punten over mijn oplossing

  1. Het cijfer van 4 plaatsen is gekoppeld aan de datum, wat betekent dat voor een nieuwe datum de telling begint bij 0000. Bijvoorbeeld GI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_0000,GI_140104_1_0000

Dit veld zal hoe dan ook uniek zijn.

  1. De oplossing vergelijkt de laatste datum in het record met de huidige datum. De logica:als de huidige datum en de laatste datum in het record overeenkomen, wordt het cijfer van 4 plaatsen verhoogd met de waarde met 1Als de huidige datum en de laatste datum in het record komt niet overeen. Het stelt het cijfer van 4 plaatsen in met de waarde 0000.

De oplossing:(onderstaande code geeft de waarde weer die de volgende GoodsInwardId zal zijn, gebruik deze volgens de vereisten om in uw oplossing te passen)

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 om de vereiste structuur te creëren (waarschijnlijke gok)

Voor de tafel:

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

Voorbeeldrecords voor de tafel:

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');

**Het is een waarschijnlijke oplossing in uw situatie, hoewel de perfecte oplossing zou zijn om een ​​identiteitskolom te hebben (gebruik indien nodig reseed) en deze te koppelen aan de huidige datum als een berekende kolom.



  1. Hoe een kolom in doctrine te hernummeren?

  2. Waarom is het het beste om een ​​telefoonnummer op te slaan als een string versus een geheel getal?

  3. MySQL-behuizing met invoegen en bijwerken

  4. Hoe onbewerkte query's uitvoeren met Laravel 5.1?