Partage
  • Partager sur Facebook
  • Partager sur Twitter

Créer une unité s'il existe pas en base

27 janvier 2020 à 14:54:53

Bonjour, 

Je voudrais créer une procédure stockée pour créer une ou plusieurs unitée(s) si elles n’existes pas en base si elle n'existes pas la crée dans une table noté unité avec un id automatique et le nom de l’unité que l'utilisateur voudra créer, si elle existe faire la requêtes d'insert dans la table Article  

  • Partager sur Facebook
  • Partager sur Twitter
27 janvier 2020 à 15:33:49

Bonjour,

VictorLcmt a écrit:

créer une ou plusieurs unitée(s) si elles n’existes pas en base si elle n'existes pas la crée

Il faut déterminer ce qui fait l'unicité de l'unité. Si c'est seulement son libellé, alors une contrainte d'unicité sur le nom suffit ...

CREATE TABLE unite (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    libelle VARCHAR(50) NOT NULL,
    UNIQUE( libelle )
);

INSERT INTO unite ( libelle ) VALUES ( "Mètre" ); -- fonctionne

INSERT INTO unite ( libelle ) VALUES ( "Metre" ); -- fonctionne

INSERT INTO unite ( libelle ) VALUES ( "Mètre" ); -- retourne une erreur

A toi de gérer l'erreur de code 23000 retournée pour informer l'utilisateur que le libellé existe déjà ;)

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 janvier 2020 à 15:54:36

D'accord merci mais ce serais pas mieux de crée un tirgger avant insertion ou la procédure stockée dira si unité existe alors insère dans la table article, sinon si unité existe pas d'abord le crée dans ma table unité avec id auto générer en clé primaire, puis récupéré l'id de la table unité et mettre l'id générer en clé étrangère sans la table Article    

Vous voyez ce que je veux faire ?

  • Partager sur Facebook
  • Partager sur Twitter
27 janvier 2020 à 16:11:31

C'est beaucoup plus compliqué à gérer ... et cela met un mécanisme de TRIGGER en plus ...

Après ce que tu peux faire c'est une procédure d'insertion qui traite l'erreur 23000. Si erreur alors récupère l'id déjà existant, sinon création et récupération du nouvel id ... cela t'affranchit du trigger ...

Dans tous les cas, la contrainte UNIQUE est la meilleure façon d'empêcher les doublons ...

Mais je suis curieux de voir comment fonctionne ta saisie côté applicatif.

Pour moi tu dois avoir une liste déroulante des unités existantes dans ton formulaire de saisie d'article, et tu laisses la possibilité à l'utilisateur de créer une unité "à la volée" pour augmenter la liste existante ...

-
Edité par Benzouye 27 janvier 2020 à 16:12:12

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
27 janvier 2020 à 16:14:14

J'ai refait le sujet, je pense que c'est plus compréhensible, j'ai mis des exemples aussi 

Je voudrais créer un trigger avant insertion ou la procédure stockée dira si l'unité existe alors on l'insère dans la table d'article, sinon si l'unité n'existe pas, créez-la d'abord dans la table d'unité avec un id en auto incrémente qui sera la clé primaire, puis récupérez l'id de la table d'unité et mettez l'id de l'unité correspondant en clé étrangère dans la table d'article.

Table unité

CREATE TABLE unite (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
libelle VARCHAR(50) NOT NULL,
);

Table article

CREATE TABLE Article(
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
Code_Article VARCHAR(255) NOT NULL
unit_id
Nombre DECIMAL(5,2)
FOREIGN KEY (unit_id) REFERENCES unite(id)

Données de la table article

"az12g","Marteau",2,231.23
"mk125","Tournevis",1,257.21

Données de la table unité
1,cm
2,l
3,kj

Et si je voulais créer l'unité m

Dans la table unité, il y aura une ligne avec le message suivant "L'unité est bien ajouter",, de plus faire une requête de Select pour voir si l'unité a bien été crée
4,m
L'unité à bien été ajouter
SELECT * FROM unite WHERE libelle = 4;

Et dans la table article ca donnéerai ca

"25lk5","Voiture",4,254.65

Si l'unité existe déjà, crée la ligne avec le message "l'article a été inséré avec succès

-
Edité par VictorLcmt 28 janvier 2020 à 11:20:02

  • Partager sur Facebook
  • Partager sur Twitter
17 février 2020 à 17:07:06

Bonjour,

Doublon

Les doublons nuisent au bon fonctionnement du forum et sont donc interdits. Si vous vous êtes trompé de section, il suffit de signaler votre sujet au staff pour qu'il le déplace au bon endroit.

Je vous invite à continuer la discussion sur l'autre sujet : https://openclassrooms.com/forum/sujet/mettre-resultat-dune-requete-dan-un-fichier-texte?page=2

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL