2010-07-15 20 views
5

Come posso creare una chiave primaria in SQL Server 2005/2008 con il formato: CurrentYear + auto-increment?Chiave primaria basata annuale?

Esempio: l'anno corrente è il 2010, in una nuova tabella, l'ID deve iniziare in 1, quindi: 20101, 20102, 20103, 20104, 20105 ... e così via.

+0

Sequenza + Trigger – BenV

+0

Non puoi semplicemente impostare l'identità se Ed valore iniziale al 20100? – Kane

+0

@Kane Ma in questo modo dopo il 20109, si somma al 20110! – BrunoSalvino

risposta

2

Questo risponde tecnicamente le esigenze di quello che hai richiesto:

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

È questa l'implementazione della soluzione proposta da @Pontus Gagge? – BrunoSalvino

+0

No. @Pontus Gagge suggerisce di creare un indice composito su due colonne anziché una colonna calcolata derivata da due colonne. –

+0

Non proprio, ma un'alternativa interessante se vuoi davvero materializzare i tuoi tasti YEAR + COUNTER direttamente. Analizzerei attentamente se SQL Server è efficiente nella gestione delle colonne calcolate come chiavi primarie come con le chiavi composite. La mia sensazione istintiva è che avrai un notevole successo nelle prestazioni. –

9

Il cleaner solution è quello di creare un composite primary key costituito ad es. Year e Counter colonne.

+1

+1 per tenere separati i tipi, anche se non mi è chiaro perché includere l'anno è necessario in primo luogo. –

+0

La mia ipotesi è che le chiavi saranno visibili agli utenti finali (come uno schema di numerazione degli ordini). Altrimenti, consiglierei una chiave puramente sintetica. –

3

Non è esattamente quello che stai cercando di ottenere, ma è molto più sensato farlo con due campi.

Se la combinazione dei due deve essere il PK per qualche motivo, basta span su entrambe le colonne. Tuttavia, sembra inutile in quanto la parte dell'identità sarà esclusiva esclusiva dell'anno.

0

devi scrivere un trigger per questo :)

Avere un tavolo separato per memorizzare l'ultima cifra utilizzata (io davvero non so se c'è qualcosa di simile a sequenze in Oracle in SQL Server).

O

È possibile ottenere l'oggetto inserito ultima voce ed estrarre l'ultimo numero di esso.

POI

è possibile ottenere l'anno in corso da SELECT DATEPART(yyyy,GetDate());

L'innesco sarebbe una ON INSERT innesco in cui si combinano l'anno e l'ultima cifra e aggiornare la colonna

Problemi correlati