2010-07-15 30 views
5

Làm cách nào để tạo Khóa chính trong SQL Server 2005/2008 với định dạng: CurrentYear + auto-increment?Khóa chính dựa trên năm?

Ví dụ: Năm hiện tại là năm 2010, trong bảng mới, ID phải bắt đầu bằng 1, vì vậy: 20101, 20102, 20103, 20104, 20105 ... v.v.

+0

Trình tự + Kích hoạt – BenV

+0

Bạn không thể chỉ định danh tính se giá trị khởi điểm ed đến năm 20100? – Kane

+0

@Kane Nhưng theo cách này sau năm 20109, nó sẽ tính đến năm 20110! – BrunoSalvino

Trả lời

2

này về mặt kỹ thuật đáp ứng nhu cầu về những gì bạn đã yêu cầu:

CREATE TABLE #test 
     (seeded_column INT IDENTITY(1,1) NOT NULL 
     , year_column INT NOT NULL DEFAULT(YEAR(GETDATE())) 
     , calculated_column AS CONVERT(BIGINT, CONVERT(CHAR(4), year_column, 120) + CONVERT(VARCHAR(MAX), seeded_column)) PERSISTED PRIMARY KEY 
     , test VARCHAR(MAX) NOT NULL); 

INSERT INTO #test (test) 
SELECT 'Badda' 
UNION ALL 
SELECT 'Cadda' 
UNION ALL 
SELECT 'Dadda' 
UNION ALL 
SELECT 'Fadda' 
UNION ALL 
SELECT 'Gadda' 
UNION ALL 
SELECT 'Hadda' 
UNION ALL 
SELECT 'Jadda' 
UNION ALL 
SELECT 'Kadda' 
UNION ALL 
SELECT 'Ladda' 
UNION ALL 
SELECT 'Madda' 
UNION ALL 
SELECT 'Nadda' 
UNION ALL 
SELECT 'Padda'; 

SELECT * 
FROM #test; 

DROP TABLE #test; 
+0

Đây có phải là việc triển khai giải pháp được đề xuất bởi @Pontus Gagge không? – BrunoSalvino

+0

No. @Pontus Gagge đề xuất tạo một chỉ mục tổng hợp trên hai cột thay vì cột được tính toán có nguồn gốc từ hai cột. –

+0

Không hoàn toàn, nhưng là một lựa chọn thú vị nếu bạn thực sự muốn thực hiện trực tiếp các khóa NĂM + COUNTER của bạn. Tôi đã nghiên cứu kỹ xem SQL Server có hiệu quả trong việc xử lý các cột được tính toán như các khóa chính như với các phím tổng hợp hay không. Cảm giác ruột của tôi là bạn sẽ đạt được hiệu suất đáng kể. –

9

cleaner solution là tạo một composite primary key bao gồm ví dụ: YearCounter cột.

+1

+1 để giữ các loại riêng biệt, mặc dù không rõ ràng với tôi tại sao bao gồm cả năm là cần thiết ngay từ đầu. –

+0

Giả định của tôi là các phím sẽ hiển thị cho người dùng cuối (chẳng hạn như lược đồ đánh số thứ tự). Nếu không, tôi muốn giới thiệu một khóa tổng hợp thuần túy. –

3

Không chắc chắn chính xác những gì bạn đang cố gắng thực hiện bằng cách làm điều đó, nhưng điều này có ý nghĩa hơn khi thực hiện điều này với hai trường.

Nếu kết hợp cả hai phải là PK vì lý do nào đó, chỉ cần trải rộng trên cả hai cột. Tuy nhiên, có vẻ như không cần thiết vì phần danh tính sẽ là duy nhất độc quyền của năm.

0

Bạn phải viết một kích hoạt cho điều này :)

Có một bảng riêng biệt để lưu trữ các chữ số cuối cùng được sử dụng (tôi thực sự không biết liệu có cái gì đó tương tự như trình tự trong Oracle trong SQL Server).

HOẶC

Bạn có thể lấy mục được chèn vào cuối cùng và trích xuất số cuối cùng của mục đó.

THEN

Bạn có thể lấy năm hiện tại từ SELECT DATEPART(yyyy,GetDate());

Trigger sẽ là một kích hoạt ON INSERT nơi bạn kết hợp năm và chữ số cuối cùng và cập nhật các cột

Các vấn đề liên quan