Есть ли редактируемые автоинкрементные идентификаторы? - PullRequest
0 голосов
/ 09 апреля 2011

Причина, по которой я нуждаюсь в этом, состоит в том, что я создал в своей таблице столбец с именем display_order, поскольку теперь он smallint и числа были предварительно определены.

Однако, когда я вставляю новую запись с моим программным обеспечениемЯ не знаю, как получить наибольшее число в этом столбце и добавить 1, поэтому я подумал о возможности автоинкрементного столбца, в котором, если я изменю 8 на 9, он изменит все остальное соответственно.

Возможно ли это?

Ответы [ 3 ]

4 голосов
/ 09 апреля 2011

Ответ на ваш вопрос «Нет» IDENTITY - единственная возможность автоматического увеличения (и эти столбцы не обновляются)

Но если это поле display_order, вы не можете просто сделатьэто float, чтобы позволить вам вставлять элементы между другими элементами, а не сдвигать все другие элементы вниз, чтобы создать разрыв?

1 голос
/ 09 апреля 2011

Поскольку вы получаете только один столбец IDENTITY на таблицу, я бы, вероятно, использовал триггер или другой механизм (если есть централизованная процедура хранения вставок), чтобы по умолчанию он был на единицу больше, чем наивысшее число в таблице, если оно не указано.Это позволяет избежать необходимости SET IDENTITY_INSERT или чего-либо подобного.

1 голос
/ 09 апреля 2011

Однако, когда я вставляю новую запись с моим программным обеспечением, я не знаю, как получить наибольшее число в этом столбце и добавить 1,

Insert MyTable( display_order, .... )
Select (
        Select Max(display_order) + 1
        From MyTable As T1
        ), ...
From MyTable

Однако я бы не рекомендовал это.Если display_order настраивается пользователем, я бы просто предположил относительные значения.Таким образом, не имеет значения, добавил ли пользователь два значения с display_order = 0. Если вы действительно хотите пройти лишнюю милю и предоставить возможность повторного упорядочивания display_order, вы можете сделать это так:

Update MyTable
Set display_order = Z.NewSeq
From    (
        Select PKCol
            , Row_Number() Over ( Order By display_order ) As NewSeq
        From MyTable
        ) As Z
    Join MyTable As T
        On T.PKCol = Z.PKCol
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...