sql >> Databáze >  >> RDS >> Sqlserver

Zvyšování vlastních hodnot primárního klíče v SQL

Před řešením otázky několik bodů k vaší otázce:

  1. Vzhledem k tomu, že vlastní primární klíč se skládá hlavně ze tří částí Datum (140102), fyzické místo, kde transakce probíhá (ID entity), 4místné číslo (9999).
  2. Podle návrhu k jednomu datu na jednom fyzickém místě nemůže dojít k více než 9999 transakcím – Moje řešení bude také obsahovat stejné omezení.

Některé body mého řešení

  1. Číslice se 4 místy je svázána s datem, což znamená, že pro nové datum začíná počet od 0000. NapříkladGI_140102_1_0001,GI_140102_1_0002,GI_140102_1_0003,GI_140103_1_000>04_0404

Toto pole bude v každém případě jedinečné.

  1. Řešení porovnává nejnovější datum v záznamu s aktuálním datem. Logika:Pokud se aktuální datum a nejnovější datum v záznamu shodují, pak se zvýší o 4 číslice o hodnotu o 1 Pokud aktuální datum a nejnovější datum v záznamu neodpovídáNastaví čtyřmístnou číslici hodnotou 0000.

Řešení:(Níže uvedený kód uvádí hodnotu, která bude dalším GoodsInwardId, použijte jej podle požadavků, aby se vešlo do vašeho řešení)

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 k vytvoření požadované struktury (Probable Guess)

Pro tabulku:

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

Vzorové záznamy pro tabulku:

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

**Je to pravděpodobné řešení ve vaší situaci, i když perfektním řešením by bylo mít sloupec identity (použijte reseed, pokud je to nutné) a spojit jej s aktuálním datem jako vypočítaný sloupec.



  1. Rozšíření tříd v databázi

  2. Jak odstranit všechny duplicitní záznamy v PHP/Mysql

  3. Všechny sloupce jsou nastaveny na stejnou hodnotu

  4. Jak importovat a exportovat databázi přes phpMyAdmin (chyba 'Přístup odepřen vytvořit databázi db_name')