Tôi đồng ý với Sean - thêm một cột danh tính, sau đó chỉ cần sử dụng một cột được tính toán cho id nhiệm vụ. Lý do cho điều này là bạn muốn sử dụng task_id
như một phần của khóa chính.
Tuy nhiên, tôi không chắc điều đó có thể xảy ra, vì để đưa một cột được tính toán vào khóa chính, cột đó phải được persisted
và vì một số lý do (tôi nghĩ đó là do sử dụng UDF) SQL Server sẽ không cho phép tôi đánh dấu nó là tồn tại.
Dù sao, đây là giải pháp được đề xuất của tôi cho việc này:
Đầu tiên, hãy tạo một hàm sẽ tính toán id tác vụ:
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
Sau đó, tạo bảng với id nhiệm vụ dưới dạng cột được tính toán:
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
Bây giờ, hãy kiểm tra nó:
INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)
SELECT *
FROM Tasks
Kết quả:
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
Bạn có thể xem bản demo trực tiếp trên rextester.