Годовой первичный ключ? - PullRequest
5 голосов
/ 15 июля 2010

Как я могу создать первичный ключ в SQL Server 2005/2008 в формате: CurrentYear + auto-increment

Пример: текущий год 2010, в новой таблице идентификатор должен начинаться с 1, поэтому: 20101, 20102, 20103, 20104, 20105 ... и т. Д.

Ответы [ 4 ]

9 голосов
/ 15 июля 2010

Чистое решение заключается в создании составного первичного ключа , состоящего, например, из столбцов Year и Counter.

3 голосов
/ 15 июля 2010

Не знаю точно, чего вы пытаетесь достичь, выполняя это, но гораздо разумнее сделать это с двумя полями.

Если комбинация двух должна по какой-либо причине быть ПК, просто распределите ее по обоим столбцам.Тем не менее, это кажется ненужным, поскольку идентификационная часть будет уникальной, исключая год.

2 голосов
/ 15 июля 2010

Это технически соответствует потребностям того, что вы просили:

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 голосов
/ 15 июля 2010

Вы должны написать триггер для этого:)

Иметь отдельную таблицу для хранения последней использованной цифры (я действительно не знаю, есть ли что-то похожее на последовательности в Oracle в SQL Server).

ИЛИ

Вы можете получить последний вставленный элемент и извлечь его последний номер.

ТО

Текущий год можно получить из SELECT DATEPART(yyyy,GetDate());

Триггером будет триггер ON INSERT, в котором вы объедините год и последнюю цифру и обновите столбец

...