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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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 : 72
    Localisation : France, Finistère (Bretagne)

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

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    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 ?

  3. #3
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 738
    Points
    11 738
    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
    Nouveau membre du Club
    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
    Points : 28
    Points
    28
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 799
    Points : 34 048
    Points
    34 048
    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 !

  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 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

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

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    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

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