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

Requêtes MySQL Discussion :

L'année d'une date dans clause UNIQUE en mysql


Sujet :

Requêtes MySQL

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Par défaut L'année d'une date dans clause UNIQUE en mysql
    Bonjour,

    EN MYSQL ....

    Pour gérer notre flux de courrier, on génère à chaque courrier reçu une référence (+1 à chaque courrier et remise à zéro le 1er janvier).
    Je voudrais qu'une condition d'unicité soit écrite au niveau de ma base de donnée. Pour que le couple "année de la date" et "référence" soit unique.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table llx_courrier
    (
      	rowid             integer AUTO_INCREMENT PRIMARY KEY, 
    	ref		  integer NOT NULL,
    	fk_affaire	  integer,
            objet           text,
    	date		  date NOT NULL,
     
    	UNIQUE(ref,YEAR(date))
    )type=innodb;
    Mais malheureusement ça passe pas sous phpmyadmin. Je n'ai pas trop d'idée du pourquoi ça ne passe pas et de comment faire autrement. Donc je suis preneur de vos lumières...

    Merci d'avance, Maximilien

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Deux choses : donner comme nom à une colonne de table un mot réservé, date, me semble, pour le moins, maladroit.
    Pourquoi ne pas créer une colonne de type YEAR et mettre l'unicité sur cette colonne et ref ?
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par piscou51000 Voir le message
    Mais malheureusement ça passe pas sous phpmyadmin. Je n'ai pas trop d'idée du pourquoi ça ne passe pas et de comment faire autrement. Donc je suis preneur de vos lumières...
    ça ne passe pas parce que tu ne peux pas faire une clause d'unicité sur un calcul (comme par exemple extraire l'année d'une date).

    Pour mettre en place la suggestion de Kris, je te propose de créer des triggers qui alimenteraient automatiquement la colonne annee :
    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
     
    CREATE TABLE llx_courrier
    (
      	rowid             integer AUTO_INCREMENT PRIMARY KEY, 
    	ref		  integer NOT NULL,
    	fk_affaire	  integer,
        objet           text,
    	reception		  date NOT NULL,
    	annee		 year,
    	UNIQUE(ref, annee)
    )type=innodb;
     
    CREATE TRIGGER courrier_BI BEFORE INSERT ON llx_courrier
    FOR EACH ROW
    SET new.annee = YEAR(new.reception) ;
     
    CREATE TRIGGER courrier_BU BEFORE UPDATE ON llx_courrier
    FOR EACH ROW
    SET new.annee = YEAR(new.reception) ;

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    39
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 39
    Par défaut
    Ok, merci..

    C'est une solution à laquelle j'avais pensé mais je trouvais ça un peu redondant de stocker l'année dans la BdD alors que j'ai deja une date qui donc me permet déjà d'avoir l'info de l'année.

    Pour le trigger, je préfére éviter car les requêtes sont traiter à la base par une classe perso, que je ne voudrais pas trop surcharger avec des requêtes de complexité supérieure.

    La solution du champs année va me satisfaire pour le moment.. Merci bien à vous.

    Je ne met pas le post en RESOLU des fois que quelqu'un passe par ici avec une solution pour le UNIQUE sur l'année d'une date..

    Bonne journée...

  5. #5
    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
    Citation Envoyé par piscou51000 Voir le message
    Pour le trigger, je préfére éviter car les requêtes sont traiter à la base par une classe perso, que je ne voudrais pas trop surcharger avec des requêtes de complexité supérieure.
    Le trigger est exécuté automatiquement par le SGBD quand l'événement survient. Ca ne surcharge en rien ta classe ! Au contraire, tu insères la date et le SGBD va remplir automatiquement la colonne Annee !
    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 !

  6. #6
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Le trigger est exécuté automatiquement par le SGBD quand l'événement survient. Ca ne surcharge en rien ta classe ! Au contraire, tu insères la date et le SGBD va remplir automatiquement la colonne Annee !
    Tu en as d'ailleurs un très bon exemple dans ce tutoriel .

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. Mois et Année d'une date dans Oracle
    Par minooo dans le forum SQL
    Réponses: 1
    Dernier message: 27/05/2013, 13h20
  2. test la valeur d'une date dans une requete
    Par TuxP dans le forum Requêtes
    Réponses: 2
    Dernier message: 07/01/2004, 14h53
  3. Récupérer le mois et l'année d'une date
    Par missllyss dans le forum SQL
    Réponses: 2
    Dernier message: 23/09/2003, 09h17
  4. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28
  5. Récupérer l'année d'une date
    Par delphim dans le forum Langage SQL
    Réponses: 3
    Dernier message: 15/01/2003, 16h33

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