Tout d'abord, bien structurer sa table pour que les contraintes d'intégrité soient pertinentes, utiles.
Avec MySQL, le INSERT IGNORE va complètement ignorer l'insertion si une erreur survient, ce n'est peut-être pas ce que tu souhaites ...
Le INSERT INTO ... ON DUPLICATE KEY UPDATE ... te permet de mettre à jour les données en cas de conflit sur une contrainte d'unicité.
C'est à toi de déterminer de quel comportement tu as besoin ...
Dans tous les cas, la gestion des erreurs doit être faites côté applicatif (en VB avec du Try/Catch par exemple), et plus elle sera fine, plus ton code sera facile à débugger et à maintenir.
Dans l'absolu tu dois pouvoir changer de SGBD sans casser ton code applicatif, et changer de code applicatif sans casser ta BDD
Oui, c'est bien ça, ou de MySQL à PostGreSQL, etc.
Ici, INSERT IGNORE et ON DUPLICATE KEY sont des syntaxes propres à MySQL, donc non portables ...
Benzouye a écrit:
tu dois pouvoir changer de SGBD sans casser ton code applicatif, et changer de code applicatif sans casser ta BDD
On est d'accord que c'est un peu du rêve, mais c'est un aspect à garder en tête lorsque tu développes pour éviter de trop lier son appli à un langage ou un logiciel ...
Ici, INSERT IGNORE et ON DUPLICATE KEY sont des syntaxes propres à MySQL, donc non portables ...
Benzouye a écrit:
On est d'accord que c'est un peu du rêve, mais c'est un aspect à garder en tête lorsque tu développes pour éviter de trop lier son appli à un langage ou un logiciel ...
OK donc il vaut mieux que je laisse gérer l'erreur par le TRY CATCH que d'utiliser une syntaxe spécifique à MYSQL.
Après il ne faut pas que cela complexifie trop ton programme non plus ... surtout si tu n'envisages pas particulièrement la portabilité de ton appli ou l'évolution de ton SGBD.
Je pense que le plus important dans l'histoire c'est :
Ta base de données seule doit gérer l'intégrité des données. L'application ne doit jamais s'en occuper. Cela se fait par le jeu des contraintes d'intégrité (clés et index) et des triggers. De ce fait, elle doit toujours lever des erreurs lorsque l'utilisateur (une application ou un humain) essaye de faire des choses "non autorisées" (clé primaire déjà existante, index unique non respecté, clé étrangère inconnue, etc.).
Ton application doit quant à elle toujours gérer toutes les erreurs retournées par la base de données et répondre en fonction.
Quand tu dis la Base de données (cela signifie les requêtes SQL) et l'application le code (VB) ?
C'est à dire les erreurs liées à la BDD (clés primaire déjà existante) doivent être géré par les requêtes (IGNORE) et les erreurs liées à l'application (DIV par 0, Chaine de caractère vide...) par le code (TRY CATCH, IsNULLOrEMPTY...)
DONC un TRY CATCH ne doit pas gérer une clés primaire déja existante.
Quand je dis base de données j'entends base de données ... Dans ton cas MySQL et les tables, colonnes, contraintes que tu as créées. En soit la base de données est autonome, et peut travailler sans autre logiciel, tu peux exécuter des requêtes SQL directement dans la console sans passer par autre chose.
Quand je dis application, j'entends le logiciel que tu programmes (ici en VB) et qui va communiquer avec la base de données.
Donc je répète :
Benzouye a écrit:
Ta base de données seule doit gérer l'intégrité des données. L'application ne doit jamais s'en occuper. Cela se fait par le jeu des contraintes d'intégrité (clés et index) et des triggers. De ce fait, elle doit toujours lever des erreurs lorsque l'utilisateur (une application ou un humain) essaye de faire des choses "non autorisées" (clé primaire déjà existante, index unique non respecté, clé étrangère inconnue, etc.).
Ton application doit quant à elle toujours gérer toutes les erreurs retournées par la base de données et répondre en fonction.
Donc si ton application veut insérer dans la base, elle envoie la requête SQL, que la base de données exécute, et si problème d'intégrité elle retourne une erreur, erreur que ton application devra traitée correctement.
Quand je dis base de données j'entends base de données ... Dans ton cas MySQL et les tables, colonnes, contraintes que tu as créées. En soit la base de données est autonome, et peut travailler sans autre logiciel, tu peux exécuter des requêtes SQL directement dans la console sans passer par autre chose.
Par exemple :
Quand un nouvel utilisateur se connecte (depuis l'interface) j'ai 3 requêtes qui s’exécute un UPDATE et 2 INSERT INTO en VB
Depuis la console en SQL je doit créer les 3 requêtes manuellement et vérifier si elle sont cohérentes.
Si j'ai bien compris je doit faire un TRIGGER qui me permet d’exécuter automatiquement mes 2 INSERT INTO à l'UPDATE
EDIT : je connais pas trop les TRIGGER, mais j'ai lu rapidement que l'UPDATE devait appartenir à la même Table que les INSERT INTO ?
Le premier UPDATE est "seul", il peut le rester ...
Concernant les INSERT, pour moi ils s'inscrivent dans une logique applicative : tu testes si l'utilisateur a déjà cette catégorie, puis tu as une réaction différente selon le test.
Si la cohérence de ces données est nécessaire côté application, alors il faut regrouper ces actions dans une transaction : si une erreur survient pendant la transaction, toute celle-ci est annulé (ROLLBACK) remettant la base comme si rien n'avait été fait, si la transaction réussie, tu continues normalement en étant sûr d'avoir les 3 enregistrements requis en base.
la cohérence est nécessaire (calcul des indicateurs) mais ne fait pas planter l'application (gestion de division par 0 ou pas de données... depuis l'application), il suffit à l'utilisateur de se déconnecter et reconnecter pour reexécuter les INSERT INTO et donc gérer les duplicate primary key.
Peut-être avec un peu de recule et plus d’expérience en SQL je serais passé par des Transactions.
Je vais étudier la possibilité car cela me permettrai d'avoir un code moins lourd.
Site Internet : https://devst.go.yj.fr
SQL GESTION DUPLICATE PRIMARY KEY
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr
Site Internet : https://devst.go.yj.fr