sql >> Database teknologi >  >> RDS >> Sqlserver

Identitetslignende kolonne, men baseret på Group By-kriterier

Jeg er enig med Sean - tilføj en identitetskolonne, og brug derefter bare en beregnet kolonne til opgave-id'et. Selvom jeg har besvaret et spørgsmål meget som dette her, er jeg ikke sikker på, om jeg skal markere denne som en dublet. Grunden til dette er, at du vil bruge task_id som en del af primærnøglen.
Jeg er dog ikke sikker på, at det er muligt, da for at inkludere en beregnet kolonne i primærnøglen skal den være persisted , og af en eller anden grund (jeg tror, ​​det er på grund af brugen af ​​en UDF) vil SQL Server ikke tillade mig at markere den som vedvarende.
Her er i hvert fald min foreslåede løsning til dette:

Først skal du oprette en funktion, der beregner opgave-id'et:

CREATE FUNCTION dbo.GenerateTaskId
(
    @Row_Id int,
    @Issue_Id int,
    @Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN

    RETURN 
    (
        SELECT COUNT(*)
        FROM dbo.Tasks
        WHERE Issue_Id = @Issue_Id
        AND Issue_Sub_ID = @Issue_Sub_ID
        AND Row_Id <= @Row_Id
    )
END
GO 

Opret derefter tabellen med opgave-id'et som en beregnet kolonne:

CREATE TABLE dbo.Tasks
(
    Row_Id [int] IDENTITY(1,1),
    Issue_ID [int] NOT NULL,
    Issue_Sub_ID [int] NOT NULL,
    Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id), 
    CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO

Test det nu:

INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)

SELECT *
FROM Tasks

Resultater:

Row_Id  Issue_ID    Issue_Sub_ID    Task_Id
1       12345       1               1
2       12345       1               2
3       12345       1               3
4       12345       2               1
5       12345       2               2
6       67890       2               1
7       67890       2               2
8       67890       2               3

Du kan se en live demo på rextester.




  1. Hvordan indsætter/opdaterer man større datastørrelser i Oracle-tabellerne?

  2. MySQL maksimalt hukommelsesforbrug

  3. Installation af Postgres på vinduer til brug med Ruby-on-Rails

  4. Proaktive SQL Server-sundhedstjek, del 1:Diskplads