Как разрешить пользователю вводить первичные ключи вручную - PullRequest
1 голос
/ 31 января 2012

У меня есть требование для моего веб-сайта ASP.NET, которое требует, чтобы я разрешил пользователю вводить первичные ключи вручную для конкретной таблицы, и если пользователь ввел первичный ключ, который уже существует в базе данных, система должна уведомить об этомпользователь как «Основной уже существует» или что-то в этом роде.

Я думаю, что пользователь должен ввести первичный ключ, и когда он вводит ключ, который уже существует, система собирается выдать исключениеза нарушение ограничения первичного ключа.Поэтому я собираюсь перехватить это исключение, и в блоке catch я собираюсь отобразить сообщение об ошибке, чтобы уведомить пользователя о дублировании первичного ключа.Тем не менее, я не уверен, что это правильный способ сделать это или есть какой-нибудь стандартный способ сделать это?

Ответы [ 6 ]

5 голосов
/ 31 января 2012

Да, это правильный подход.Однако следует упомянуть несколько вещей:

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

  • Вызывая исключение, как часть нормального потока управления, обычно хмурится:SELECT для существующего ключа, а затем INSERT будет более элегантным, чем ожидание возникновения исключения.(Используйте транзакцию и соответствующий уровень изоляции транзакции, чтобы другой клиент не мог вставить строку между вашим SELECT и вашим INSERT).

1 голос
/ 31 января 2012

Зачем пользователю создавать первичный ключ и гадать, что вводить и уже занято?Я имею в виду, я знаю, что int - это широкий диапазон чисел, но пользователи, вероятно, будут пытаться использовать 3-4-значные числа;в конце концов, они начнут бить дураков.Итак, почему ??Вы усложняете без необходимости.

Пусть БД сгенерирует идентификатор.Сообщите об этом пользователю, если это необходимо.Не может быть проще.

1 голос
/ 31 января 2012

Первичный ключ в MS Sql Server является уникальным индексом. Если вы нарушите ограничение индекса, база данных выдаст ошибку и откатит транзакцию.

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

ИМХО, такой подход хорош. Часто альтернативой является вопрос о наличии значений в базе данных. Это в конечном итоге также в конечном итоге с исключением, если был найден. Если вы решите разрешить БД поднять исключение, не забудьте упомянуть это в документации по коду. Потому что использование его без такой информации может вызвать в будущем некоторые проблемы.

1 голос
/ 31 января 2012

Я не собираюсь обсуждать, стоит ли вам это делать или нет (не думаю, что вы должны, кстати: p), но вот код:

SET IDENTITY_INSERT TABLE ON

помните, что выможет иметь только одну таблицу на базу данных, установленную на ON

1 голос
/ 31 января 2012

Это довольно уродливо.Не следует использовать исключения для «нормального» логического потока - это усложняет чтение и сопровождение кода и приводит к замедлению (хотя вы, вероятно, не заметите влияния на производительность).

Я бы разделил его на метод «проверки», который должен проверять данные, введенные пользователем, - это правильный тип данных?Соответствует ли он минимальным требованиям по длине?Это уникально?

Если метод validate возвращает нарушение, покажите его пользователю;дать им возможность исправить это.

Если метод «validate» не возвращает нарушение, попробуйте вставить запись и поймать исключение «duplicate key» (кто-то другой мог ввести эту самую запись в промежутке между вашей проверкой и вводомзапись).

1 голос
/ 31 января 2012

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

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