2015-04-02 7 views
-1

Я хочу непрерывную последовательность чисел как первичный ключ. Но по некоторым причинам я не хочу использовать семя Identity или Sequence.SQL - первичный ключ автоинкремента без семени идентичности или последовательности

Ниже мой код

Insert Into Items (ItemId, ItemName) 
Values((Select MAX(ItemId)+1 from Items), 'Some Name') 

Это прекрасно работает, когда есть некоторые строки в таблице. Но когда в таблице нет ни одной строки Элементы, MAX (itemId) дает NULL.

Я хочу, чтобы MAX (itemId) дал 0, когда строк нет.

+0

Вы также можете обрабатывать это с помощью вычисленного столбца или триггера. –

+0

@TabAlleman, что еще больше усложнит проблему, поскольку я использую эту базу данных в своем приложении C# –

+0

Почему вы не хотите использовать то, что работает? Каждый раз, когда вы пытаетесь перевернуть свой собственный тип столбца, у вас будут проблемы с параллелизмом. Идентичность идеально подходит для такого типа вещей. –

ответ

2

Любой из этих двух способов будет работать:

Insert Into Items (ItemId, ItemName) 
Values(COALESCE((Select MAX(ItemId)+1 from Items), 0), 'Some Name') 

или

Insert Into Items (ItemId, ItemName) 
Values(ISNULL((Select MAX(ItemId)+1 from Items), 0), 'Some Name') 

COALESCE возвращает первый ненулевой аргумент. ISNULL возвращает второй аргумент, если первый имеет значение NULL.

+1

Это в основном работает, но параллелизм - настоящая проблема с этим типом кода. –

Смежные вопросы