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 :

Trigger : Erreur 1054


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Femme Profil pro
    sig
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut Trigger : Erreur 1054
    Bonjour,

    J'ai besoin de calculer l'âge de personnes par rapport à leur date de naissance.
    J'ai créé un trigger en BEFORE INSERT, je peux le valider mais j'ai une erreur 1054 à l'ajout d'une nouvelle personne : "ERROR 1054: 1054: Unknown column 'Date_Anniversaire' in 'field list' ".

    Est-ce que quelqu'un peut m'aider svp? J'ai essayé différentes façons mais je n'ai pas l'habitude de faire des triggers...

    Voici la structure de ma table :
    id | Nom_utilisateur | Date_anniversaire | Age

    Voici le trigger :
    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
    CREATE DEFINER=`admin`@`%` TRIGGER `pre`.`test_age_BEFORE_INSERT` BEFORE INSERT ON `test_age` FOR EACH ROW
    BEGIN
     
     
    set new.Age= (SELECT EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM Date_Anniversaire)
    - (CASE WHEN
    EXTRACT(MONTH FROM CURRENT_DATE) < EXTRACT(MONTH FROM Date_Anniversaire)
    THEN 1
    ELSE
    (CASE WHEN
    (EXTRACT(DAY FROM CURRENT_DATE) < EXTRACT(DAY FROM Date_Anniversaire)
    AND EXTRACT(MONTH FROM CURRENT_DATE) = EXTRACT(MONTH FROM Date_Anniversaire))
    THEN 1
    ELSE 0
    END)
    END));
    END

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 134
    Par défaut
    Même si mon message ne résout en rien l'erreur de syntaxe, j'ai toutefois une remarque à exprimer :

    Ce trigger calcule l'age au moment de l'insertion de la ligne. Cela signifie qu'une fois l'anniversaire passé l'âge sera erroné.
    Pourquoi ne pas utiliser une vue pour ce calcul ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre à l'essai
    Femme Profil pro
    sig
    Inscrit en
    Mai 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : sig

    Informations forums :
    Inscription : Mai 2017
    Messages : 4
    Par défaut
    Effectivement ma requête n'est pas juste ... (j'ai précisé que je débutais...), à refaire...

    En ce qui concerne l'utilisation d'une vue, je souhaiterai écrire directement l'âge dans ma table.

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    En ce qui concerne l'utilisation d'une vue, je souhaiterai écrire directement l'âge dans ma table.
    Je plussoie al1_24 : normalement, on ne stocke pas en base de données une donnée calculable à tout moment, sauf cas particuliers (archivage de données ou données calculées dont les paramètres de calcul peuvent changer, TVA par exemple, encore que...).
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre chevronné Avatar de isabelle.letrong
    Femme Profil pro
    Conseil - Consultante en systèmes d'information
    Inscrit en
    Juillet 2010
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Conseil - Consultante en systèmes d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2010
    Messages : 109
    Par défaut
    Bonjour Aude44,

    Je ne reviens pas sur les remarques de al1_24 et CinePhil qui sont fort pertinentes.
    Ceci étant, sans regard particulier sur l’algorithme utilisé, voici ce qui cloche dans votre TRIGGER :

    Extrait de votre code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set new.Age= (SELECT EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM Date_Anniversaire)
    1. En premier lieu, CURRENT_DATE est une fonction et doit donc être invoquée comme telle : CURRENT_DATE(),
    2. Ensuite, ce qui provoque l'erreur 1054 est que 'Date_Anniversaire' est une colonne de la table objet du trigger. Par conséquent vous ne pouvez faire référence à cette colonne qu'en utilisant NEW.Date_Anniversaire

  6. #6
    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 883
    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 883
    Par défaut
    Salut à tous.

    Citation Envoyé par Al1_24
    Pourquoi ne pas utiliser une vue pour ce calcul ?
    Excellente remarque ! Cela mérite un +1

    Citation Envoyé par Aude44
    En ce qui concerne l'utilisation d'une vue, je souhaiterai écrire directement l'âge dans ma table.
    On vient de vous dire que ce n'est pas la bonne façon de faire !
    Pourquoi ? Parce que l'âge varie en fonction du temps.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set new.Age= (SELECT EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM Date_Anniversaire)
    Le calcul est faux ! Vous ne savez pas calculer l'âge d'une personne.
    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
    --------------
    select current_date
    --------------
     
    +--------------+
    | current_date |
    +--------------+
    | 2018-04-12   |
    +--------------+
    --------------
    select EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(year from '2000-04-10') as age
    --------------
     
    +------+
    | age  |
    +------+
    |   18 |
    +------+
    --------------
    select EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(year from '2000-04-15') as age
    --------------
     
    +------+
    | age  |
    +------+
    |   18 |
    +------+
    --------------
    select year(subdate(current_date, to_days('2000-04-10'))) as age
    --------------
     
    +------+
    | age  |
    +------+
    |   18 |
    +------+
    --------------
    select year(subdate(current_date, to_days('2000-04-15'))) as age
    --------------
     
    +------+
    | age  |
    +------+
    |   17 |
    +------+
     
    Appuyez sur une touche pour continuer...
    Citation Envoyé par isabelle.letrong
    1. En premier lieu, CURRENT_DATE est une fonction et doit donc être invoquée comme telle : CURRENT_DATE(),
    Les deux formes d'écritures sont admises sous mysql.
    --> https://dev.mysql.com/doc/refman/5.5...n_current-date
    L'un étant synonyme de l'autre.

    A titre indicatif, je donne le déclencheur calculant l'age d'une personne, histoire de vous montrer la syntaxe. Voici ce que je propose :
    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `personne`
    --------------
     
    --------------
    CREATE TABLE `personne`
    ( `id`         integer unsigned  NOT NULL auto_increment PRIMARY KEY,
      `nom`        varchar(255)      NOT NULL,
      `prenom`     varchar(255)      NOT NULL,
      `naissance`  date              NOT NULL,
      `age`        integer unsigned      NULL  default null
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    CREATE TRIGGER `anniversaire`
    BEFORE INSERT ON `personne`
    FOR EACH ROW
    BEGIN
      SET NEW.age = year(subdate(current_date, to_days(new.naissance)));
    END
    --------------
     
    --------------
    insert into `personne` (`nom`,`prenom`, `naissance`) values
      ('nom-1', 'prenom-1', '1972-05-17'),
      ('nom-2', 'prenom-2', '1980-12-03'),
      ('nom-3', 'prenom-3', '1985-01-26'),
      ('nom-4', 'prenom-4', '1998-09-14'),
      ('nom-5', 'prenom-5', '2002-07-01')
    --------------
     
    --------------
    select * from `personne`
    --------------
     
    +----+-------+----------+------------+------+
    | id | nom   | prenom   | naissance  | age  |
    +----+-------+----------+------------+------+
    |  1 | nom-1 | prenom-1 | 1972-05-17 |   45 |
    |  2 | nom-2 | prenom-2 | 1980-12-03 |   37 |
    |  3 | nom-3 | prenom-3 | 1985-01-26 |   33 |
    |  4 | nom-4 | prenom-4 | 1998-09-14 |   19 |
    |  5 | nom-5 | prenom-5 | 2002-07-01 |   15 |
    +----+-------+----------+------------+------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Et voici la vue réalisant le calcul de l'age :
    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
    --------------
    create view `vue` as
      select  nom,
              prenom,
              naissance,
              year(subdate(current_date, to_days(naissance))) as age
        from  personne
    order by  age
    --------------
     
    --------------
    select * from `vue`
    --------------
     
    +-------+----------+------------+------+
    | nom   | prenom   | naissance  | age  |
    +-------+----------+------------+------+
    | nom-5 | prenom-5 | 2002-07-01 |   15 |
    | nom-4 | prenom-4 | 1998-09-14 |   19 |
    | nom-3 | prenom-3 | 1985-01-26 |   33 |
    | nom-2 | prenom-2 | 1980-12-03 |   37 |
    | nom-1 | prenom-1 | 1972-05-17 |   45 |
    +-------+----------+------------+------+
    @+

Discussions similaires

  1. [TRIGGER] Erreur 06512/04088
    Par weed dans le forum SQL
    Réponses: 5
    Dernier message: 23/10/2007, 15h26
  2. [Trigger] Erreur 1136 lors d'une insertion
    Par tyrant dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/05/2006, 21h41
  3. TRIGGER Erreur PLS-00357
    Par fuhraih dans le forum Oracle
    Réponses: 6
    Dernier message: 19/04/2006, 10h20
  4. [10g] Trigger erreur de compilation
    Par flasomm dans le forum Oracle
    Réponses: 2
    Dernier message: 03/01/2006, 03h07
  5. [Debug] [Trigger] erreur d'exe pas très précise
    Par viena dans le forum Langage SQL
    Réponses: 4
    Dernier message: 19/08/2005, 11h36

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