Как я могу убедиться, что пользователь не пытается ввести уже существующий идентификатор первичного ключа?

2

У меня есть приложение, которое добавляет домашних животных в базу данных SQL.

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

Я думаю, мне нужно, чтобы значение PetID (верхнее текстовое поле) автоматически определялось при загрузке страницы, со значением, которое не будет конфликтовать с уже существующим значением...

Может кто-нибудь помочь? я понятия не имею, как это сделать

Мне нужна page_load для автоматического поиска в базе данных SQL доступных идентификаторов PetID, выбора одной из них с наименьшим значением и автоматической установки ее в текстовое поле (так что пользователю не придется беспокоиться о выборе той, которая не ' т уже занят)...

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

Изображение 174551 Изображение 174551

  • 2
    Возможный дубликат столбца идентификации против первичного ключа
  • 0
    Что вы подразумеваете под поиском доступного идентификатора? Есть предварительно сгенерированные идентификаторы или вы имеете в виду последний идентификатор + 1? Вы должны использовать значение идентификатора, как в другом комментарии.
Показать ещё 7 комментариев
Теги:
sql-server
visual-studio

5 ответов

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

Вы можете создать PetId как столбец идентификаторов, как показано ниже:

[PetId] [int] IDENTITY(10,1) NOT NULL

Таким образом, вам не нужно будет добавлять его вручную, каждый раз, когда вы добавляете запись Pet, PetId будет сгенерирован автоматически, и это будет уникальным. Таким образом, столкновение PetId не произойдет.

Здесь 10 представляет первый номер Id, а 1 представляет, как будут увеличиваться ваши PetIds.

С уважением, Пратик

  • 0
    Да, согласен, это может быть в том случае, когда пользователь хочет сохранить PetId согласно своему желанию. Если это не беспокоит пользователя, то мы можем сделать это как столбец идентичности.
  • 0
    Можете ли вы описать функцию "(10,1)" в своем ответе? Я сделал это, и это сработало, у меня было 6 домашних животных в базе данных, но затем идентификаторы домашних животных начинались с 10, он не учитывал идентификаторы 7,8 и 9 ...
Показать ещё 8 комментариев
1

Одним из вариантов будет использование последовательности:

CREATE SEQUENCE pet_id_seq START WITH 7

Я начинаю с 7, потому что это первый доступный pet_id

Затем при загрузке страницы получите следующее значение для последовательности, выполнив следующий запрос:

SELECT (NEXT VALUE FOR pet_id_seq) AS next_pet_id

И покажите значение, возвращаемое запросом, в текстовом поле pet_id.

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

Другой вариант - использовать следующий запрос для заполнения текстового поля pet_id:

SELECT MAX(pet_id) + 1 AS next_pet_id FROM pets

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

  • 0
    будет только один пользователь
  • 0
    как я могу реализовать это?
Показать ещё 3 комментария
1

Обычно вы вводите свои данные и возвращаете идентификатор после добавления записи в базу данных (используя вставку Id столбце Id).

Если вы хотите, чтобы следующий номер отображался ДО создания данных, используйте целочисленный столбец для ID без параметра Вставка идентификатора и создайте последовательность SQL Server. Создайте хранимую процедуру, чтобы вернуть следующий порядковый номер для отображения на странице создания.

0

Установите для столбца id автоматическое увеличение и не позволяйте пользователю вставлять его, пусть база данных решит это для себя. Или вы можете изменить тип столбца id и использовать Guid.NewGuid() для создания нового идентификатора.

-1

Добавьте событие TextChanged, которое проверяет существующие значения и сообщает пользователю, доступен ли введенный PetID или нет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню