Как мне ... проверить наличие дубликатов записей в БД mysql при добавлении новой строки
В настоящее время я использую следующую хранимую процедуру SQL для добавления информации о пациенте. Хранимая процедура проверяет, существует ли пациент уже в БД. Важно понимать, что БД будет хранить миллионы строк.
CREATE DEFINER=`rootuser`@`%` PROCEDURE `SP_patAddDetails`( IN pFileNo VARCHAR(11), IN pKey VARCHAR(1), IN pTitle VARCHAR(15), IN pFirstName VARCHAR(30), IN pInitials VARCHAR(5), IN pSurname VARCHAR(30), IN pIDNo VARCHAR(15), IN pDOB VARCHAR(10), IN pGender VARCHAR(8), IN pLanguage VARCHAR(15), IN pOccupation VARCHAR(30), IN pDependantCode VARCHAR(2), IN pRelationship VARCHAR(15), IN pMemNo VARCHAR(20) ) BEGIN START TRANSACTION; INSERT INTO patDetails(patFileNo, patKey, patTitle, patFirstName, patInitials, patSurname, patIDNo, patDOB, patGender, patLanguage, patOccupation, patDependantCode, patRelationship, patMemNo, patUpdated) /* to avoid duplicate entries during the patient add process check to see if patient already exist in the patDetails table*/ SELECT * FROM (SELECT pFileNo, pKey, pTitle, pFirstName, pInitials, pSurname, pIDNo, pDOB, pGender, pLanguage, pOccupation, pDependantCode, pRelationship, pMemNo, now()) AS tmp WHERE NOT EXISTS ( SELECT patFileNo, patKey, patTitle, patFirstName, patInitials, patSurname FROM patDetails WHERE patFileNo = pFileNo AND patKey = pKey AND patTitle = pTitle AND patFirstName = pFirstName AND patInitials = pInitials AND patSurname = pSurname ) LIMIT 1; /* VALUES (pAccKey, pKey, pTitle, pFirstName, pInitials, pSurname, pIDNo, pDOB, pGender, pLanguage, pOccupation, pDependantCode, pRelatioship, pMemNo, NOW); SELECT LAST_INSERT_ID() */ COMMIT; SELECT LAST_INSERT_ID() COMMIT; END
Есть три вещи, которые я хотел бы знать:
1. Можно ли улучшить эту процедуру MySQL для достижения лучшей производительности?
2.существует больше информации, которая должна храниться отдельно от того, что в настоящее время отображается в SP, и она также хранится в различных таблицах, например: таблица контактной информации, таблица адресной информации, таблица медицинской помощи и т. д.
Есть ли способ, с помощью которого я могу проверить ответ "false" (без повторяющейся записи), получить LAST_INSERT_ID для использования в качестве индекса при добавлении другой информации,
3. Можно ли поместить все в одну хранимую процедуру ?
Что я уже пробовал:
Хранимая процедура, как показано в вопросе.
0x01AA
грубая сила: вставьте его и справьтесь с ситуацией ошибки. Для этого, конечно, нужен уникальный ключ над вашими полями.
Tino Fourie
Я понимаю ограничения столбцов и их использование, но, к сожалению, не могу использовать их, потому что мне приходится справляться с несоответствиями в информации о пациенте.
Как грубая сила улучшает производительность ?
Как объединить все остальные вставки в одну хранимую процедуру и проверить, нет ли дубликата записи ?
0x01AA
Может быть, я не все понимаю в деталях ;)
Из вашего примера я понимаю, что "patFileNo, patKey, patTitle, patFirstName, patInitials, patSurname" должно быть уникальным. Поэтому я бы определил уникальный ключ для этих полей и вставил его. Insert в любом случае проверит это и выдаст условие ошибки, если вы нарушите это условие.... так зачем же мне самому делать такую же проверку?
Это выглядит/звучит так, как будто ваша текущая БД не позволяет установить этот уникальный ключ в данный момент, потому что у вас есть все уже несогласованные данные в нем. Если бы это было так, я бы действительно постарался сначала все убрать...
Tino Fourie
Спасибо за ваш ответ и объяснение. Что касается несогласованности информации, то пример:
У меня могли бы быть такие записи, как: AAA BBB CCC DDD EEE,
тогда я мог бы получить информацию об одном и том же пациенте, например: AAA BB1 CCC DD2 EEE.
ААА - оздоровительная идентификатора нет (ССН / ППСН) количество индивидуальных.
Это несоответствие происходит потому, что информация поступает из разных источников и потому, что люди не очень заботятся о правильности информации, я мог бы в конечном итоге получить пациента без инициалов, но с соответствующим идентификатором нет.
Если я помещу ограничение NN в столбец инициалов, и поскольку программное обеспечение, используемое для сбора информации о пациенте, не проверяет наличие "пустого" поля инициалов, я потенциально могу пропустить этого пациента, где в сравнении я мог бы добавить информацию и заставить пользователя обновить ее.