J'ai donc une table d'employés comme suit:Vérifiez les doublons basé sur deux colonnes
empid | companyid | empnum | ...
1 | 1 | 1 | ...
2 | 1 | 2 | ...
3 | 1 | 3 | ...
4 | 2 | 1 | ...
5 | 2 | 2 | ...
Chaque entrée des employés sur la table obtient un identifiant unique (empid) qui est généré automatiquement par MSSQL. J'ai une application PHP qui prend un fichier CSV en entrée avec une "liste principale" des employés. Cependant, ce fichier CSV n'a que les colonnes de "empnum" à droite (il ne contient PAS companyid, ou évidemment employeeid). companyid est ajouté lorsque je parcourt chaque ligne du fichier CSV. Le CSV devrait seulement contenir les employés qui ne sont pas encore dans la base de données, mais il n'y a aucune garantie, donc je dois vérifier pour s'assurer que l'employé n'est pas là avant l'insertion. La méthode de vérification est de s'assurer que pour ce companyid particulier (disons que nous insérons pour companyid = 1), il n'y a pas déjà un empnum correspondant dans la table. Donc, si j'avais un fichier CSV avec ces données, il serait valable:
empnum, ...
4, ...
Cependant, si j'avais un fichier CSV avec ces données, il ne serait pas valide:
empnum, ...
3, ...
Depuis 3 déjà existe en tant qu'empnum pour companyid = 1, l'importation ENTIER doit échouer. Dans l'application PHP, j'ai:
try {
db->beginTransaction();
while (($data = fgetcsv($handle, 5000, ",")) !== FALSE) {
//SQL TO INSERT ROW
}
db->commit();
} catch (PDO Exception) {
db->rollBack();
}
Que dois-je utiliser SQL pour insérer la ligne afin qu'elle provoquera une exception si un empnum existe déjà pour cette CompanyID? Quels changements de base de données devrais-je faire? Mes pensées initiales sont:
Option 1 - Insérez dans une table temporaire, puis exécutez une requête select qui joint les deux tables sur les valeurs correspondantes dans companyid/empnum, si elle retourne des lignes> 0, lancez une exception. PRO: Seulement 1 sélectionnez. CON: Tout est inséré dans la table temporaire ALORS jeté dans la table réelle SI elle passe select = beaucoup de temps perdu si elle échoue
Option 2- Faire une instruction select basée sur la ligne courante, si elle renvoie des lignes> 0, lancer une exception, sinon insérer dans la vraie table. PRO: Vous attrapez les échecs dès qu'ils se produisent afin que vous puissiez potentiellement gagner du temps. CON: Vos requêtes ont maintenant augmenté de (2x-1) donc vous avez beaucoup de frais supplémentaires si vous réussissez!
Donc mes questions seraient: - Quelle est la meilleure option (1, 2, ou autre chose entièrement)? - Puis-je en quelque sorte obtenir MSSQL pour lancer l'exception lors de l'insertion?
Ce n'est pas le code exact, mais vous pouvez avoir une idée: $ nextEmpnum = (. "SELECT MAX empnum DE employee_table OU CompanyID =" $ company_id) +1 "INSERT INTO valeurs employee_table (" $ nextEmpnum.. ",". $ company_id –
Désolé ... J'aurais mieux fait de spécifier. Je ne cherche pas à CREER un identifiant unique pour l'empnum.empnum sera fourni par l'entreprise qui importe les données. employé existe déjà sur la table (basé sur une combinaison de companyid et empnum) –
Aussi, je ne sais pas pourquoi cette question a eu une downvote.Si vous downvoted, s'il vous plaît dites pourquoi! –