IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

L'ajout d'un trigger me génère une erreur lors d'un update 1054 de champ inconnu


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut L'ajout d'un trigger me génère une erreur lors d'un update 1054 de champ inconnu
    Bonjour,

    Voici mon soucis :
    Je crée un trigger sur ma table products, afin que lorsque mon champ ProductAvailQty tombe à 0, il flag à 0 mon champ ModelFlag de ma table models.
    La création se passe bien, mais lorsque je tente de modifier mon champ ProductAvailQty, il me génère une erreur de champ inconnu dans fieldlist... alors que je le fais via l'interface graphique...
    Comment peut-il être inconnu alors qu'il me le propose , bref j'ai tenté à la main aussi, sans succès

    Voici mes codes
    D'abord la table models
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    -- Structure de la table `models`
    --
     
    CREATE TABLE IF NOT EXISTS `models` (
      `ModelID` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `ModelName` varchar(100) NOT NULL,
      `ModelDescription` varchar(500) DEFAULT NULL,
      `ModelPath` varchar(250) DEFAULT NULL,
      `ModelFlag` tinyint(1) NOT NULL DEFAULT '1',
      PRIMARY KEY (`ModelID`),
      UNIQUE KEY `ModelID_UNIQUE` (`ModelID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=9 ;
     
    --
    -- Contenu de la table `models`
    --
     
    INSERT INTO `models` (`ModelID`, `ModelName`, `ModelDescription`, `ModelPath`, `ModelFlag`) VALUES
    (1, '5.jpg', 'Première image, avec refresh. Voici une petite description de cette image, qui ne doit contenir que 255 caracteres maximum.', '../images/products/', 1),
    (2, '123.jpg', 'Seconde teste image de test', '../images/products/', 1),
    (3, 'Koala.jpg', 'Toto le petit koala', '../images/products/', 1),
    (4, 'Phare.jpg', 'Description phare', '../images/products/', 1),
    (8, 'Méduses.jpg', 'Description méduses', '../images/products/', 1);
    Ensuite la table products avec le trigger au bout
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    CREATE TABLE IF NOT EXISTS `products` (
      `ProductID` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `ProductHeight` decimal(6,2) DEFAULT NULL,
      `ProductLength` decimal(6,2) DEFAULT NULL,
      `ProductAmount` decimal(15,2) DEFAULT NULL,
      `ProductAvailQty` int(10) DEFAULT NULL,
      `supports_SupportID` int(10) unsigned NOT NULL DEFAULT '0',
      `Models_ModelID` int(10) unsigned NOT NULL,
      PRIMARY KEY (`ProductID`,`supports_SupportID`,`Models_ModelID`),
      UNIQUE KEY `ProductID_UNIQUE` (`ProductID`),
      KEY `fk_Products_supports1_idx` (`supports_SupportID`),
      KEY `fk_Products_Models1_idx` (`Models_ModelID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
     
    --
    -- Contenu de la table `products`
    --
     
    INSERT INTO `products` (`ProductID`, `ProductHeight`, `ProductLength`, `ProductAmount`, `ProductAvailQty`, `supports_SupportID`, `Models_ModelID`) VALUES
    (1, '100.00', '80.00', '150.00', 15, 1, 1),
    (2, '99.00', '99.00', '100.00', 10, 2, 1),
    (3, '150.00', '151.00', '152.00', 10, 1, 2),
    (4, NULL, NULL, NULL, NULL, 2, 8);
     
    --
    -- Déclencheurs `products`
    --
    DROP TRIGGER IF EXISTS `soldOut`;
    DELIMITER //
    CREATE TRIGGER `soldOut` AFTER UPDATE ON `products`
     FOR EACH ROW BEGIN
    IF ( ProductAvailQty = 0 )
    THEN UPDATE models
    SET ModelFlag = 0
    WHERE ModelID = (select Models_ModelID from products where ProductAvailQty = 0 AND ModelFlag != 0);
    END IF;
    END
    //
    DELIMITER ;
     
    --
    -- Contraintes pour les tables exportées
    --
     
    --
    -- Contraintes pour la table `products`
    --
    ALTER TABLE `products`
      ADD CONSTRAINT `fk_Products_Models1` FOREIGN KEY (`Models_ModelID`) REFERENCES `models` (`ModelID`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      ADD CONSTRAINT `fk_Products_supports1` FOREIGN KEY (`supports_SupportID`) REFERENCES `supports` (`SupportID`) ON DELETE NO ACTION ON UPDATE NO ACTION;

    Une idée salvatrice ???

    Merci d'avance pour votre temps.

  2. #2
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 880
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 880
    Par défaut
    Salut Byron_ID.

    Voici ton trigger, tel que tu l'as écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DROP TRIGGER IF EXISTS `soldOut`;
    DELIMITER //
    CREATE TRIGGER `soldOut` AFTER UPDATE ON `products`
     FOR EACH ROW BEGIN
    IF ( ProductAvailQty = 0 )
    THEN UPDATE models
    SET ModelFlag = 0
    WHERE ModelID = (select Models_ModelID from products where ProductAvailQty = 0 AND ModelFlag != 0);
    END IF;
    END
    //
    DELIMITER ;
    Ce n'est pas ainsi que l'on écrit une colonne, quand on veut faire un test, dans un "trigger update" (Ce que j'ai mis en rouge ci-dessus).

    Il faut mettre : IF ( new.ProductAvailQty = 0 )

    C'est le fait de ne pas mettre le "new." qui perturbe les insertions que tu fais après le trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO `products` (`ProductID`, `ProductHeight`, `ProductLength`, `ProductAmount`, `ProductAvailQty`, `supports_SupportID`, `Models_ModelID`) VALUES
    (4,     NULL,     NULL,     NULL, NULL, 2, 8)
    --------------
     
    ERROR 1054 (42S22) at line 92: Champ 'ProductAvailQty' inconnu dans field list
    @+

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2015
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2015
    Messages : 9
    Par défaut
    Bonjour,

    J'étais tombé sur des old et new, mais essentiellement avec des before, et dans des cas bien différents.
    Ici vu que je venais tester une valeur après un update et non avant, ça me semblait absurde de mettre un old ou new, vu que la valeur est déjà modifiée.
    Il faut ajouter à cela que le descriptif de l'erreur n'est pour ma part pas vraiment explicite.

    Bref, un grand merci pour cet éclaircissement, j'ai appris quelque chose

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. trigger me signal une erreur lors de son exécution
    Par scofild20 dans le forum SQL
    Réponses: 7
    Dernier message: 02/05/2009, 14h22
  2. Exécutable qui génére une erreur windows
    Par jouidos dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/01/2007, 15h50
  3. .lib qui génère une erreur au link
    Par mrshadow dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 19/01/2007, 10h47
  4. [ADO.Net][Access] Pourquoi ai-je une erreur lors de l'Update ?
    Par nazimb dans le forum Accès aux données
    Réponses: 1
    Dernier message: 15/05/2006, 09h37
  5. [VB6] Problème de textbox multiligne qui génére une erreur
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/02/2006, 16h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo