Создание первичного ключа с помощью NEWID()

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

SELECT SUBSTRING(CAST(NEWID() AS varchar(38)), 1, 16)

Всякий раз, когда я перезапускаю запрос, он меняет значение NEWID() каждый раз, поэтому он загружает дубликаты в мою таблицу каждую ночь вместо обновления записей. В любом случае я могу сохранить newid() как статическое значение каждый раз, когда я запускаю запрос?

Спасибо Рэйчел

2 ответа

Решение

NEWID() По замыслу возвращает уникальные (на ваш компьютер) значения GUID. Всякий раз, когда вы бежите

SELECT NEWID()

Вы увидите другое значение.

Похоже, ваш код UPSERT должен объединить данные из исходных таблиц в первичный ключ, который вы можете надежно использовать в будущем, чтобы определить, нужно ли вставлять или обновлять данную строку.

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

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

Другие вопросы по тегам