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 :

auto_increment pour une colonne de type char


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut auto_increment pour une colonne de type char
    supposons que j'ai la table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    create table person(
    id char (8) primary key,
    nom varchar (30) not null,
    date_naissance date)
    la codification de l'id de la personne est la suivante:
    année de naissance puis un numéro séquentiel (ex 15000001,16000001, 16000002, ect). ce dernier est remis à zero pour chaque année.
    comment faire çà en MY SQL à l'aide du trigger ou autre manière. Je peux par exemple faire çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table person(
    numero_sequentiel int auto_increment not null,
    annee year not null,
    nom varchar (30) not null,
    date_naissance date,
    constraint pk_person primary key (numero_sequentiel, annee)
    )
    Mais comment remettre à zéro le numéro séquentiel à chaque année.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut win_ubuntu.

    Avant de vous donner une possible solution à votre problème, j'aimerai que vous me répondiez à mes questions :

    Citation Envoyé par win_ubuntu
    Mais comment remettre à zéro le numéro séquentiel à chaque année.
    1) A qui va vous servir ce numéro séquentiel ?
    a) pour identifier une ligne dans une table MySql ?
    b) attribuer à une personne un numéro du genre matricule ?

    Il est important de définir correctement le rôle fonctionnel de ce numéro séquentiel car cela aura des implications que l'on ne pourra plus modifier par la suite.

    2) pourquoi avez-vous besoin de le remettre à zéro ?

    3) comment allez-vous incrémenter de ce numéro séquentiel ?
    a) par "auto_increment" je suppose ?
    b) ou par une gestion qui vous est propre. Je dis cela car dans votre exemple, vous le faites commencer à "15000001".
    c) je vois aussi qu'il y a des trous dans votre numérotation.
    Comment connaitre l'ancienne valeur de ce numéro afin de pouvoir faire un +1 dessus ?

    Citation Envoyé par win_ubuntu
    comment faire çà en MY SQL à l'aide du trigger ou autre manière.
    4) il me faut les autres tables, comme par exemple le stockage du numéro séquentiel dont vous parlez ?

    Citation Envoyé par win_ubuntu
    ce dernier est remis à zero pour chaque année.
    5) dois-je comprendre que la totalité de la table est aussi remise à zéro ?
    Si c'est non, comment allez-vous gérer l'existant disons de l'année précédente avec celle de la nouvelle année ?

    6) avant de faire quoi que ce soit, il faut mieux définir les règles de gestions de ce que vous envisager de faire.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut &
    faites une clé unique,
    l'identifiant global devra être généré par l'application, mais à partir d'une table de séquence et devra faire la bascule en cas de changement d'année :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TABLE sequence (id INT NOT NULL, sequence VARCHAR(50) NOT NULL);
    INSERT INTO sequence VALUES (16000001,'sequence1');
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    UPDATE sequence SET id=LAST_INSERT_ID(id+1) where sequence='sequence1'
    SELECT LAST_INSERT_ID();


    http://dev.mysql.com/doc/refman/5.7/...last-insert-id
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  4. #4
    Membre habitué
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2010
    Messages
    212
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2010
    Messages : 212
    Points : 184
    Points
    184
    Par défaut
    merci beaucoup les gars.
    peut être, je n'ai pas bien expliquer mon souci. Je me demande est ce qu 'il y' un truc en MY SQL qui me permet de saisir automatiquement la clé de la personne (ex: utilisation d' un trigger ou autre truc). par exemple
    quand j’exécute l'instruction suivante en utilisant la première table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert into person (nom, date_naissance) values ('nom1', '01/05/2016')
    avant l'insertion, le SGBD doit consulter la colonne date_naissance pour vérifier s'il existe déjà des personnes ayant 2016 comme année de naissance:
    • si ce la cas, il prend le dernier saisie avec comme année 2016. il extraire la séquence des chiffres qui se trouve juste après 2016 (supposons 000020; c-à-d: 20 personnes sont né en 2016), puis l’incrémente. donc la nouvelle ligne saisie sera: 16000021,'nom1', '01/05/2016'

    • sinon la nouvelle ligne saisie sera: 16000001,'nom1', '01/05/2016'

  5. #5
    Membre extrêmement actif Avatar de ddoumeche
    Homme Profil pro
    Ingénieur recherche et développement
    Inscrit en
    Octobre 2007
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Singapour

    Informations professionnelles :
    Activité : Ingénieur recherche et développement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 676
    Points : 2 009
    Points
    2 009
    Par défaut
    Non, ce genre de séquence n'est supporté par aucun SGDBR, même si vous pouvez toujours vous lancer dans une usine à gaz de type udf

    Vous pouvez toujours faire un trigger pour l'insert, mais où vas stocker la partie incrémentée ? vous avez besoin d'une séquence
    La joie de l'âme est dans la planification -- Louis Hubert Liautey

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    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 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut win_ubuntu.

    Ça vous arrive de répondre aux questions que l'on vous pose ?
    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
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    --------------
    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 `person`
    --------------
     
    --------------
    CREATE TABLE `person`
    (
      `numero`      bigint  unsigned NOT NULL primary key,
      `nom`         varchar(255)     NOT NULL,
      `naissance`   date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    DROP TRIGGER IF EXISTS `increment`
    --------------
     
    --------------
    CREATE TRIGGER `increment`
    BEFORE INSERT ON `person`
    FOR EACH ROW BEGIN
      SET NEW.numero=ifnull((select max(numero)+1 from `person` where year(naissance)=year(NEW.naissance)),cast(concat(year(NEW.naissance), '0000000001') as unsigned));
    END
    --------------
     
    --------------
    INSERT INTO `person` (`nom`,`naissance`) VALUES
      ('nom 01', '2016-01-01'),
      ('nom 02', '2015-01-01'),
      ('nom 03', '2016-02-01'),
      ('nom 04', '2014-01-01'),
      ('nom 05', '2016-03-01'),
      ('nom 06', '2015-02-01'),
      ('nom 07', '2016-04-01'),
      ('nom 08', '2016-05-01'),
      ('nom 09', '2015-03-01'),
      ('nom 10', '2015-04-01')
    --------------
     
    --------------
    select * from person order by naissance, nom
    --------------
     
    +----------------+--------+------------+
    | numero         | nom    | naissance  |
    +----------------+--------+------------+
    | 20140000000001 | nom 04 | 2014-01-01 |
    | 20150000000001 | nom 02 | 2015-01-01 |
    | 20150000000002 | nom 06 | 2015-02-01 |
    | 20150000000003 | nom 09 | 2015-03-01 |
    | 20150000000004 | nom 10 | 2015-04-01 |
    | 20160000000001 | nom 01 | 2016-01-01 |
    | 20160000000002 | nom 03 | 2016-02-01 |
    | 20160000000003 | nom 05 | 2016-03-01 |
    | 20160000000004 | nom 07 | 2016-04-01 |
    | 20160000000005 | nom 08 | 2016-05-01 |
    +----------------+--------+------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Je ne voie aucun intérêt de créer un identifiant de cette nature !

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/02/2016, 15h26
  2. [Débutant] Type Enum pour une colonne d'un DataTable
    Par thibab dans le forum VB.NET
    Réponses: 2
    Dernier message: 19/09/2014, 21h45
  3. Réponses: 2
    Dernier message: 13/11/2009, 13h14
  4. requete vers une colonne de type datetime
    Par Zorgz dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2003, 12h37
  5. Réponses: 2
    Dernier message: 18/10/2003, 14h42

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