Как сгенерировать уникальный идентификатор в sql, если null

Вопрос:

Я пытаюсь добавить столбец в существующую таблицу SQL типа uniqueidentifier. Этот столбец не должен быть нулевым и, конечно, уникальным. Я попытался выполнить этот код:

ALTER TABLE ScheduleJobs ADD CurrentInstanceID uniqueidentifier not null

с последующим:

ALTER TABLE ScheduleJobs ADD CONSTRAINT DF_CurrentInstanceID DEFAULT newsequentialid() FOR CurrentInstanceID

Однако, когда я создаю новую запись (из С#), uniqueidentifier всегда имеет все нули (предположительно null.) Я могу создать GUID на С# и передать его в sql при создании новой записи, которая работает нормально, но я обеспокоен тем, что может быть создан дублирующий GUID. Основываясь на моих показаниях, кажется, что это будет крайне редкий случай, но всегда кажется, что у плохой практики есть какая-то потенциальная ошибка, которая плавает вокруг. Обратите внимание, что поле не будет PK для таблицы. Предложения и мнения приветствуются ради образования.

Я использую среду С# 4.0 с MS SQL SERVER 2008

Лучший ответ:

Извините за задержку, но я рад сказать, что я решил эту проблему. Спасибо всем за вашу подавляющую поддержку. В то время как никто не ударил ноготь по голове (и были некоторые хорошие предложения), Элдог поднял Entity Framework, не играющий хорошо в своем комментарии. Благодаря ему я просто Googled Entity Framework + GUID и нашел решение.

В этой статье мы рассмотрим эту проблему и подробно объясним проблему, решение и шаги по ее устранению. Отмечу, что я решил пройти и проверить один шаг за раз и что мне не нужно было делать последний шаг. Это заставляет меня поверить, что часть проблемы, возможно, была решена в более поздних версиях Entity Framework.

Я просто остановил файл edmx в представлении дизайна (а не xml) и StoreGeneratedPattern свойству StoreGeneratedPattern значение «Identity».

Еще раз спасибо за помощь и предложения. Ты потрясающая группа.

Ответ №1

Ваш код С# пытается передать в CurrentInstanceID при создании записи? Если да, можете ли вы удалить этот столбец из инструкции INSERT?

Мы делаем это с помощью числовых первичных ключей. Наш код С# вызывает хранимую процедуру для операций CRUD в наших записях. Код С# генерирует отрицательный ключ на стороне клиента для собственного использования. Когда он готов к созданию записи, он передает этот ключ в хранимую процедуру.

Процесс игнорирует этот ключ и вставляет остальные данные. Вывод proc — это фактический ключ, который SQL присваивает записи. Наконец, код С# объединяет новый ключ в существующие данные.

Ответ №2

Я бы не использовал GUID для этого. GUID используются в довольно большом количестве операций в Windows, поэтому это не будет идентификатор, который будет уникален только в вашем приложении, это будет уникальный идентификатор в вашей операционной системе. Если это не повлияет на ваше дело, я бы не использовал его.

Вы можете использовать инкрементное значение, как простой uint. Если в вашей таблице уже есть некоторые данные, вы можете написать сценарий, который заполняет существующие строки инкрементальными значениями для вашего нового столбца и добавлять уникальный столбец в ваш столбец после выполнения этого сценария.

Ответ №3

в исходной таблице Create или alter table используйте что-то вроде следующего

create table ScheduleJobs (keyval int, id2 uniqueidentifier not null default newsequentialid())

то не ссылайтесь на столбец в своей вставке и добавляется новое значение GUID

Оцените статью
TechArks.Ru
Добавить комментарий