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

Langage SQL Discussion :

Unique + Duplicate


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut Unique + Duplicate
    Bonjour bonjour,

    Bon alors là deux petits soucis...

    1er: J'aimerai utiliser le on duplicate key mais avec deux unique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test (nom,etat,pack) values(1,3,2) on duplicate key update etat = values(etat)


    Ici, la 3ème ligne je l'ai écrite moi même. Mon problème est que lorsque je souhaite passer les colonnes (nom, pack) en unique, il m'est impossible de créer une ligne comme la 3ème. c'est à dire que ma commande modifie ma première ligne au lieu d'en créer une nouvelle.

    J'espère m'être exprimé clairement.

    Attention 2éme problème:

    j'aimerai ajouter une date et trouver une methode car en fonction de la date, les colonnes (nom,pack) peuvent ce répéter genre 2mois plus tard.

    du coup j'ai pensé à un truc du genre :

    insert into test (nom,etat,pack,date) values(1,5,2,MONTH(1)) on duplicate key update etat = values(etat)
    ou encore
    insert into test (nom,etat,pack,date) values(1,5,2,between "2013-01-01" and "2013-04-01") on duplicate key update etat = values(etat)
    Mouhahahahahahaha (rire sadique!!) C'est dur hein? .... je craque

    Bon courage! Moi je vais me balader sur une autoroute.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 401
    Par défaut
    Bonjour,
    Citation Envoyé par kayri Voir le message
    Bonjour bonjour,

    Bon alors là deux petits soucis...

    1er: J'aimerai utiliser le on duplicate key mais avec deux unique.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test (nom,etat,pack) values(1,3,2) on duplicate key update etat = values(etat)


    Ici, la 3ème ligne je l'ai écrite moi même. Mon problème est que lorsque je souhaite passer les colonnes (nom, pack) en unique, il m'est impossible de créer une ligne comme la 3ème. c'est à dire que ma commande modifie ma première ligne au lieu d'en créer une nouvelle.
    Il ne faut pas déclarer le couple nom/pack en unique, mais en clé primaire de la table. D'ailleurs la clause est bien ON DUPLICATE KEY.

    Citation Envoyé par kayri Voir le message
    j'aimerai ajouter une date et trouver une methode car en fonction de la date, les colonnes (nom,pack) peuvent ce répéter genre 2mois plus tard.
    Dans ce cas le couple nom/pack n'est plus unique, il ne peut pas être déclaré non plus comme clé primaire sur la table. Il faut ajouter la colonne Date (avec un autre nom d'ailleurs).

    Tatayo.

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut
    Dans ce cas le couple nom/pack n'est plus unique, il ne peut pas être déclaré non plus comme clé primaire sur la table. Il faut ajouter la colonne Date (avec un autre nom d'ailleurs).
    Merci, mais du coup comment je peux faire ça par une commande sql?

    En gros ça devrait réalisé un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if(Date choisie existe)
        		if( nom et pack existe)
        			alors changer Etat
        		else(nom et pack n'existe pas)
        				créer la ligne
     
        	else (date n'est pas trouver)
        			créer la ligne.
    Très archaïque comme code, je l'avoue. Mais je n'ai pas trouvé d'autre moyen pour expliquer clairement ce que je souhaite au final.

    C'est pour cela que la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into test (nom,etat,pack,date) values(1,5,2,date) on duplicate key update etat = values(etat)
    pouvait répondre à ma demande.

    Merci de ta réponse rapide

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 401
    Par défaut
    C'est faisable, mais il faut que la clé de la table soit (nom,pack,date), et non uniquement (nom,pack).

    Tatayo.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut
    Citation Envoyé par tatayo Voir le message
    C'est faisable, mais il faut que la clé de la table soit (nom,pack,date), et non uniquement (nom,pack).
    Merci!
    Juste, Comment tu fais ça? Car je ne suis pas un expert..

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Ca fonctionne avec une contrainte d'unicité :
    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
    mysql> create table test (nom int(1), etat int(1), pack int(1));
    Query OK, 0 rows affected (0.06 sec)
     
    mysql> alter table test add constraint uk_test unique key (nom, pack);
    Query OK, 0 rows affected (0.19 sec)
    Records: 0  Duplicates: 0  Warnings: 0
     
    mysql> insert into test values (1,2,1),(2,3,2);
    Query OK, 2 rows affected (0.02 sec)
    Records: 2  Duplicates: 0  Warnings: 0
     
    mysql> insert into test (nom, etat, pack) values (1,3,2) on duplicate key update etat = values(etat);
    Query OK, 1 row affected (0.03 sec)
     
    mysql> select * from test;
    +------+------+------+
    | nom  | etat | pack |
    +------+------+------+
    |    1 |    2 |    1 |
    |    2 |    3 |    2 |
    |    1 |    3 |    2 |
    +------+------+------+
    3 rows in set (0.00 sec)
     
    mysql> insert into test (nom, etat, pack) values (1,3,1) on duplicate key update etat = values(etat);
    Query OK, 2 rows affected (0.03 sec)
     
    mysql> select * from test;
    +------+------+------+
    | nom  | etat | pack |
    +------+------+------+
    |    1 |    3 |    1 |
    |    2 |    3 |    2 |
    |    1 |    3 |    2 |
    +------+------+------+
    3 rows in set (0.00 sec)
     
    mysql>

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Ca fonctionne avec une contrainte d'unicité :
    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
    mysql> create table test (nom int(1), etat int(1), pack int(1));
    Query OK, 0 rows affected (0.06 sec)
     
    mysql> alter table test add constraint uk_test unique key (nom, pack);
    Query OK, 0 rows affected (0.19 sec)
    Records: 0  Duplicates: 0  Warnings: 0
     
    mysql> insert into test values (1,2,1),(2,3,2);
    Query OK, 2 rows affected (0.02 sec)
    Records: 2  Duplicates: 0  Warnings: 0
     
    mysql> insert into test (nom, etat, pack) values (1,3,2) on duplicate key update etat = values(etat);
    Query OK, 1 row affected (0.03 sec)
     
    mysql> select * from test;
    +------+------+------+
    | nom  | etat | pack |
    +------+------+------+
    |    1 |    2 |    1 |
    |    2 |    3 |    2 |
    |    1 |    3 |    2 |
    +------+------+------+
    3 rows in set (0.00 sec)
     
    mysql> insert into test (nom, etat, pack) values (1,3,1) on duplicate key update etat = values(etat);
    Query OK, 2 rows affected (0.03 sec)
     
    mysql> select * from test;
    +------+------+------+
    | nom  | etat | pack |
    +------+------+------+
    |    1 |    3 |    1 |
    |    2 |    3 |    2 |
    |    1 |    3 |    2 |
    +------+------+------+
    3 rows in set (0.00 sec)
     
    mysql>
    Je t'aime. Je comprend mieux comment ça fonctionne maintenant. Un grand merci il ne me reste plus qu'a jouer avec la date pour finaliser !


    merciiiiii

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2012
    Messages : 59
    Par défaut
    Bon au final, j'ai beau chercher je ne trouve pas comment je peu gérer ma date dans mon insert into:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO bdd_kase (server, etat, package,datime) VALUES ('s1',3,'p1', XXXXXXXX) ON duplicate KEY UPDATE etat = VALUES(etat)
    J'ai essayé pas mal de truc genre MONTH(1) il me dit que datime ne peux être null.

    J'ai essayé avec un between même si je m'en doutais, ça ne fonctionne pas.

    Je fais des recherches sur ma copine google mais pas grand chose à ce sujet..

    Donc je demande vos lumières une dernière fois!

    Merci!

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

Discussions similaires

  1. On duplicate key et 2 clefs unique
    Par Xunil dans le forum Requêtes
    Réponses: 0
    Dernier message: 15/05/2009, 19h47
  2. [MySQL] duplicate entry avec unique
    Par djoumusic dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 07/07/2008, 20h03
  3. Erreur sql duplicate key violates unique constaint
    Par valvalval dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/06/2008, 23h15
  4. duplication d'identifiant unique
    Par threshold dans le forum JSF
    Réponses: 7
    Dernier message: 17/04/2008, 09h41
  5. [Firebird 1.5] duplicate value in unique index
    Par bambou dans le forum SQL
    Réponses: 5
    Dernier message: 03/03/2005, 17h58

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