Генерация уникального идентификатора для таблицы - PullRequest
0 голосов
/ 01 июля 2019

This is a screanshot for the database

Я пытаюсь создать таблицу в SQL Server. Я хочу создать уникальный 32-битный идентификатор и быть первичным ключом.

Я определяю его как первичный ключ и задаю тип - как включить генерацию? Как я могу установить его на 32 бит?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Использование типа uniqueidentifier или случайно сгенерированных неупорядоченных символов для первичного ключа является плохой идеей и фактически ограничит вас в будущем.Да, они гарантированно уникальны, но они не гарантируются последовательными.Имейте в виду, что если вы делаете какую-либо кластеризацию для обеспечения высокой доступности, вы рискуете перекрыть uniqueidentifier.NEWID() не создаст перекрытие, если оно всегда используется на одном и том же сервере.Когда вы меняете серверы, нет гарантии, что не будет.Это может случаться редко, но я видел, как это происходит, и это не красиво, когда это происходит.

IDENTITY предназначен для использования с типами данных, которые являются последовательными по своей природе, такими как INT, BIGINT... Это гарантирует уникальность строки, а также обеспечивает последовательное хранение и поиск для кластеризованного индекса и предотвращает фрагментацию индекса.

Если вы заинтересованы в наличии значения типа uniqueidentifier для облегчения поиска из чего-либокак и вызов API, тогда лучше иметь таблицу сопоставления с естественным упорядоченным типом для первичного ключа и uniqueidentifier в виде некластеризованного столбца в таблице.Таким образом, объединения могут основываться на упорядоченном первичном ключе для всех внешних таблиц.

0 голосов
/ 01 июля 2019

Если вы хотите 32-битный уникальный идентификатор, который уникален в каждой строке.,,ну, вы только что определили столбец identity:

create table . . . (
    id int identity primary key,
    . . .
);

Это, конечно, порядковый номер, но он соответствует вашим условиям.

РЕДАКТИРОВАТЬ:

Если вы хотите newid(), тогда используйте значение по умолчанию:

create table . . . (
    id uniqueidentifier primary key default newid(),
    . . .
);

Конечно, newsequentialid() - лучший выбор, чем newid(), но ваш пример кода использует newid().

A uniqueidentifer имеет размер 16 байт (128 бит), поэтому он не соответствует вашим потребностям.Я не думаю, что есть какой-либо другой встроенный механизм для 32-битного уникального номера, который гарантированно будет уникальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...