Saya setuju dengan Sean - tambahkan kolom identitas, lalu gunakan kolom yang dihitung untuk id tugas. Meskipun saya telah menjawab pertanyaan seperti ini di sini, saya tidak yakin untuk menandai yang ini sebagai duplikat. Alasannya adalah karena Anda ingin menggunakan task_id
sebagai bagian dari kunci utama.
Namun, saya tidak yakin itu mungkin, karena untuk memasukkan kolom yang dihitung dalam kunci utama harus persisted
, dan untuk beberapa alasan (saya pikir itu karena penggunaan UDF) SQL Server tidak mengizinkan saya untuk menandainya sebagai bertahan.
Bagaimanapun, inilah solusi yang saya usulkan untuk ini:
Pertama, buat fungsi yang akan menghitung id tugas:
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
Kemudian, buat tabel dengan id tugas sebagai kolom yang dihitung:
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
Sekarang, ujilah:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Hasil:
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
Anda dapat melihat demo langsung di rextester.