Как бороться с дубликатами в базе данных? - PullRequest
0 голосов
/ 16 ноября 2011

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

Ответы [ 8 ]

2 голосов
/ 16 ноября 2011

Это достаточно легко осуществить с помощью УНИКАЛЬНОГО ограничения на стороне базы данных, так что это моя рекомендация.Я пытаюсь поместить как можно больше данных в базу данных, чтобы избежать неправильных данных (хотя иногда и неизбежных).

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

1 голос
/ 16 ноября 2011

Зависит от того, вставляете ли вы один или миллион, а также от того, является ли дубликат первичным ключом.

Если это первичный ключ, прочитайте: http://database -programmer.blogspot.com / 2009/06 / подхода к upsert.html

UPSERT или ON DUPLICATE KEY ... Идея создания UPSERT проста. Клиент выполняет команду INSERT. Если строка уже существует с заданный первичный ключ, то вместо того, чтобы выдать ошибку нарушения ключа, он принимает неключевые значения и обновляет строку.

Это один из тех странных (и очень необычных) случаев, когда MySQL на самом деле поддерживает то, что вы не найдете во всех других более зрелые базы данных. Так что если вы используете MySQL, вам не нужно делать ничего особенного, чтобы сделать UPSERT. Вы просто добавляете термин «ON» DUPLICATE KEY UPDATE "до оператора INSERT:

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

Что касается вашего реального вопроса, мне не очень нравится идея использовать try / catch для выполнения программы, но на самом деле вы должны оценить удобочитаемость и пользовательский опыт (в данном случае производительность) и выбрать то, что вы считаете лучшее из смеси двух.

0 голосов
/ 16 ноября 2011

База данных - это компьютеризированное представление набора бизнес-правил, и СУБД используется для применения этих бизнес-правил в качестве ограничений. Ни один из них не может проверить, что предложение в базе данных верно в реальном мире. Например, если рассматриваемая модель является сотрудниками предприятия, а таблица Employees содержит двух человек по имени СУБД «Джимми Барнс» (и база данных) не может знать, является ли один из них дубликатом, являются ли они настоящими людьми и т. Д. Надежный источник необходим для определения существования и идентичности. В приведенном выше примере отдел персонала предприятия отвечает за проверку общедоступных записей, просмотр ссылок, проверку того, что человек еще не внесен в платежную ведомость, и т. Д., А затем распределение уникального ссылочного номера сотрудника, который можно использовать в качестве ключа. Вот почему мы ищем стандартные отраслевые идентификаторы с надежным источником: ISBN для книг, VIN для автомобилей, ISO 4217 для валют, ISO 3166 для стран и т. Д.

0 голосов
/ 16 ноября 2011

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

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

Например, фрагмент кода SQL может выглядеть примерно так:

    select @ret_val = 0
   If exists (select * from employee where last_name = @param_ln and first_name = @param_fn)
       select @ret_val = -1
    Else
       -- your insert statement here

   Select @ret_val

Ваше условие для дублированных значений будет зависеть от того, что вы определяете какдубликат записи.В вашем приложении вы должны использовать возвращаемое значение, чтобы узнать, были ли данные дубликатами.Удачи!

0 голосов
/ 16 ноября 2011

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

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

0 голосов
/ 16 ноября 2011

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

0 голосов
/ 16 ноября 2011

Вы можете создать уникальный составной ключ

ALTER TABLE `TableName` ADD UNIQUE KEY (KeyOne, KeyTwo, ...);
0 голосов
/ 16 ноября 2011

Вы можете добавить в свою таблицу УНИКАЛЬНОЕ ограничение. Что-то вроде

CREATE TABLE IF NOT EXISTS login
(
    loginid SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    loginname CHAR(20) NOT NULL,
    UNIQUE (loginname) 
);

Это обеспечит одинаковые имена входа в систему.

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