Поэтому у меня есть таблица сотрудника следующим образом:Проверка дубликатов на основе двух столбцов
empid | companyid | empnum | ...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 1 | 3 | ...
4 | 2 | 1 | ...
5 | 2 | 2 | ...
Каждая запись сотрудника на столе получает уникальный идентификатор (EmpId), который генерируется автоматически MSSQL. У меня есть приложение PHP, которое берет CSV-файл в качестве входных данных с «основным списком» сотрудников. Однако этот файл CSV имеет только столбцы из правого элемента empnum (он не содержит companyid или явно employeeid). companyid добавляется, когда я повторяю каждую строку файла CSV. CSV должен содержать только сотрудников, которых нет в базе данных, но нет никакой гарантии, поэтому мне нужно проверить, чтобы работник не присутствовал перед вставкой. Метод проверки заключается в том, чтобы убедиться, что для этого конкретного companyid (скажем, мы вставляем для companyid = 1), в таблице еще нет соответствующего empnum. Так что, если у меня был файл CSV с этими данными, это было бы справедливо:
empnum, ...
4, ...
Однако, если я стандартный файл CSV с этими данными, было бы не действительным:
empnum, ...
3, ...
С 3 уже существует как empnum для companyid = 1, ENTIRE import должен завершиться неудачей. В приложении PHP, у меня есть:
try {
db->beginTransaction();
while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
//SQL TO INSERT ROW
}
db->commit();
} catch (PDO Exception) {
db->rollBack();
}
Что SQL я должен использовать, чтобы вставить строку так, что это вызовет исключение, если empnum уже существует для этого CompanyID? Какие изменения в базе данных мне нужно будет сделать? Мои первоначальные мысли:
Вариант 1 - Вставьте во временную таблицу, затем запустите запрос выбора, который соединяет две таблицы с соответствующими значениями в companyid/empnum, если он возвращает строки> 0, генерирует исключение. PRO: Только 1 выбрать. CON: Все вставлено в таблицу temp. THEN сбрасывается в реальную таблицу, если он пропускает select = много потерянного времени, если он не работает
Вариант 2- Делайте инструкцию выбора на основе текущей строки, если она возвращает строки> 0, выставить исключение, иначе вставить в реальную таблицу. PRO: Вы ломаете неудачи, как только они происходят, поэтому вы можете сэкономить время. CON: Ваши запросы теперь увеличены на (2x-1), поэтому у вас будет много дополнительных накладных расходов, если вы преуспеете!
Так что мои вопросы будут такими: - Какой лучший вариант (1, 2 или что-то еще полностью)? - Могу ли я каким-то образом заставить MSSQL генерировать исключение при вставке?
Это не точный код, но вы можете получить представление: $ nextEmpnum = (. "SELECT MAX empnum FROM employee_table WHERE CompanyID =" $ company_id) +1 "INSERT INTO employee_table значений (" $ nextEmpnum.. ",". $ company_id –
Извините ... Я должен был указать лучше. Я не пытаюсь создать уникальный идентификатор для empnum. empnum будет поставляться компанией, которая импортирует данные. Мне просто нужно посмотреть, сотрудник уже существует на столе (на основе комбинации companyid и empnum) –
Кроме того, не знаю, почему этот вопрос получил нижний предел. Если вы проигнорировали, скажите, пожалуйста, почему! –