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 :

insert avec un id en auto-increment


Sujet :

Langage SQL

  1. #1
    Membre expert
    insert avec un id en auto-increment
    Bonjour,

    j'ai créé une table (MySQL) dont la première colonne est un ID en auto-increment :

    Code sql :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
     
     
    DROP TABLE IF EXISTS `license`;
    CREATE TABLE IF NOT EXISTS `license` (
      `id` smallint(11) NOT NULL AUTO_INCREMENT,
      `id_SESA` int(6) DEFAULT NULL,
      `alternate_id` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `platform` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `platform_owner` int(6) DEFAULT NULL,
      `publisher` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `application_name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `HFMCODE` varchar(10) COLLATE utf8_bin DEFAULT NULL,
      `Currently_active` varchar(5) COLLATE utf8_bin DEFAULT NULL,
      `Activate_date` date DEFAULT NULL,
      `Deactivate_date` varchar(2) COLLATE utf8_bin DEFAULT NULL,
      `Group_name` varchar(2) COLLATE utf8_bin DEFAULT NULL,
      `Office_Country` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Firstname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Lastname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Company_name` varchar(30) COLLATE utf8_bin DEFAULT NULL,
      `Job_code` varchar(5) COLLATE utf8_bin DEFAULT NULL,
      `Reporting_entity` varchar(5) COLLATE utf8_bin DEFAULT NULL,
      `Business_unit_name` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Location` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Internet_Address` varchar(50) COLLATE utf8_bin DEFAULT NULL,
      `Manager_firstname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Manager_lastname` varchar(20) COLLATE utf8_bin DEFAULT NULL,
      `Manager_email` varchar(50) COLLATE utf8_bin DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


    Pour y insérer un nouvel enregistrement, je fais une requête de ce genre : INSERT INTO `license` VALUES('','100008','(none)','Software Engineering','69723','CollabNet','TeamForge_Full','','TRUE','2018-07-26','','','France','Bilhel','Ben Abdellah','Schneider Electric France','','','','','','','','')

    J'ai ce message d'erreur :
    #1366 - Incorrect integer value: '' for column 'id' at row 1
    Comment faudrait-il faire ? Merci.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Expert éminent
    Bonjour,
    A mon avis vu que tu ne précise pas la liste des colonnes, MySQL les prend dans l'ordre de création de la table.
    Donc la première valeur est affectée à la première colonne: l'ID.
    Il faut donc ajouter la liste des colonnes dans la requête.
    Et pour moi, il faut TOUJOURS mettre la liste des colonnes. Si ton schéma change (pour une raison ou une autre), soit ta requête ne fonctionne plus, soit elle insère les mauvaises valeurs dans les mauvaises colonnes.

    Tatayo.

  3. #3
    Membre expert
    Merci pour ta réponse. L'insertion a fonctionné en mettant le nom de chaque colonne, mais en ne mettant pas l'ID (si je le mettais, même message d'erreur qu'avant) :

    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    INSERT INTO `license` (id_SESA,alternate_id,platform,platform_owner,publisher,application_name,HFMCODE,Currently_active,Activate_date,Deactivate_date,Group_name,Office_Country,Firstname,Lastname,Company_name,Job_code,Reporting_entity,Business_unit_name,Location,Internet_Address,Manager_firstname,Manager_lastname,Manager_email) VALUES('100008','(none)','Software Engineering','69723','CollabNet','TeamForge_Full','','TRUE','2018-07-26','','','France','Bilhel','Ben Abdellah','Schneider Electric France','','','','','','','','')
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Expert éminent
    Effectivement, j'aurai du être plus explicite:
    Il faut systématiquement mettre dans une requête INSERT la liste des colonnes pour lesquelles une valeur va être affectée, les autres "récupèrent" alors leur valeur par défaut (définie dans la structure de la table).
    Dans ton exemple la colonne Id récupère alors un auto-incrément, et d'autres colonnes éventuellement absentes un NULL.

    Tatayo.