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

MySQL Discussion :

[mysql 5.7] Forcer les requete 'd'insert' sans reseigner tous les champs ?


Sujet :

MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut [mysql 5.7] Forcer les requete 'd'insert' sans reseigner tous les champs ?
    Bonjour,

    J'ai cette structure de table ->

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE IF NOT EXISTS `table_data` (
    `id` int(11) NOT NULL,
      `id_link` int(11) NOT NULL DEFAULT '0',
      `id_group` char(10) NOT NULL DEFAULT '',
      `val` varchar(150) NOT NULL,
      `idd` int(11) unsigned NOT NULL
    ) ENGINE=MyISAM AUTO_INCREMENT=29296819 DEFAULT CHARSET=latin1;
    Sur mysql 5.5 je peux faire cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    INSERT INTO
    table_data
    SET
    id_link = '59382',
    val = '4'
    mais sur mysql 5.7 j'ai cette erreur ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #1048 - Column 'idd' cannot be null
    Ce qui n'est pas illogique, mais comment puis-je forcer cet 'INSERT' sans toucher à la structure de ma table, cela marche très bien sur mysql 5.5 ?
    Merci d'avance pour votre aide,
    Flash

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    soit vous ajoutez une valeur par défaut dans la définition de la table, soit vous fournissez la valeur lors de l'insert

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Oui, bien-sur, mais je ne souhaite pas toucher à la structure des tables, je voulais juste trouver un moyen de conserver les structures des tables actuelles tout en passant à mysql 5.7.
    Cordialement,

  4. #4
    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 flashguitou.

    L'erreur est pourtant clair !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1048 (23000): Column 'idd' cannot be null
    Vous devez mettre autre chose que la valeur NULL pour la colonne 'idd'.

    Donc faites comme le suggère Escartefigue, renseignez la colonne dans le update :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    UPDATE table_data SET id_link = '59382', idd = 0 where val = '4';
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 16
    Points : 17
    Points
    17
    Par défaut
    Je vous remercie de vos réponses, mais je cherche un moyen via un paramètre de mysql, pour ne pas toucher au format des tables.
    Via google je me rends compte que je ne suis pas le seul... mais bon pas de soucis il y a des solutions.
    Cordialement,
    Flash

  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 flashguitou.

    J'ai essayé de comprendre votre problème. Il y a surement quelque chose que vous ne nous dites pas ou que vous ne savez pas.

    1) Si je crée une table avec une colonne sans le "default 0", comme dans votre exemple et que je désire insérer une ligne où je ne précise pas le nom de la colonne en question, j'obtiens l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1364 (HY000) at line 39: Field 'num' doesn't have a default value
    2) maintenant, je précise le nom de la colonne dans le insert et je mets la valeur null. Voici l'erreur que j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1048 (23000) at line 40: Le champ 'num' ne peut être vide (null)
    Voici mon jeu d'essai sous MySql 5.7.10, pour illustrer ce que j'avance.
    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
    --------------
    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 `test`
    --------------
     
    --------------
    create table `test` (
      `id`   int unsigned  NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `val`  int unsigned  NOT NULL DEFAULT 0,
      `num`  int unsigned  NOT NULL
    ) ENGINE=MyIsam
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert        into `test` (`val`,`num`) values (1, 25)
    --------------
     
    --------------
    insert        into `test` (`val`)       values (2)
    --------------
     
    ERROR 1364 (HY000) at line 39: Field 'num' doesn't have a default value
    --------------
    insert        into `test` (`val`,`num`) values (3, null)
    --------------
     
    ERROR 1048 (23000) at line 40: Le champ 'num' ne peut être vide (null)
    --------------
    insert ignore into `test` (`val`,`num`) values (4, null)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-----+-----+
    | id | val | num |
    +----+-----+-----+
    |  1 |   1 |  25 |
    |  2 |   4 |   0 |
    +----+-----+-----+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Si l'on ajout le paramètre "ignore" dans l'insert, l'insertion se fait avec la valeur par défaut zéro.

    La variable dont vous parlez est "sql_mode" et le paramètre qui pose problème est "STRICT_TRANS_TABLES" : http://dev.mysql.com/doc/refman/5.7/...t_trans_tables
    Voici ce qui se passe si je ne précise pas ce paramètre :
    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
    88
    89
    90
    91
    92
    --------------
    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 `test`
    --------------
     
    --------------
    create table `test` (
      `id`   int unsigned  NOT NULL AUTO_INCREMENT PRIMARY KEY,
      `val`  int unsigned  NOT NULL DEFAULT 0,
      `num`  int unsigned  NOT NULL
    ) ENGINE=MyIsam
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    select @@session.sql_mode
    --------------
     
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | @@session.sql_mode                                                                                                                        |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +-------------------------------------------------------------------------------------------------------------------------------------------+
    --------------
    set session sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    --------------
     
    --------------
    select @@session.sql_mode
    --------------
     
    +-----------------------------------------------------------------------------------------------------------------------+
    | @@session.sql_mode                                                                                                    |
    +-----------------------------------------------------------------------------------------------------------------------+
    | ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +-----------------------------------------------------------------------------------------------------------------------+
    --------------
    insert        into `test` (`val`,`num`) values (1, 25)
    --------------
     
    --------------
    insert        into `test` (`val`)       values (2)
    --------------
     
    --------------
    insert        into `test` (`val`,`num`) values (3, null)
    --------------
     
    ERROR 1048 (23000) at line 40: Le champ 'num' ne peut être vide (null)
    --------------
    insert ignore into `test` (`val`,`num`) values (4, null)
    --------------
     
    --------------
    select * from test
    --------------
     
    +----+-----+-----+
    | id | val | num |
    +----+-----+-----+
    |  1 |   1 |  25 |
    |  2 |   2 |   0 |
    |  3 |   4 |   0 |
    +----+-----+-----+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    Si l'on ne précise pas "STRICT_TRANS_TABLES", MySql force la valeur par défaut si celle-ci n'est pas précisé dans la déclarative de la table.

    Venons-en à ma remarque du début de ce message. Pourquoi avez-vous l'erreur 1048 ?
    D'après ce que j'ai compris, vous forcez l'insertion avec la valeur NULL, comme dans mon exemple.
    Je suppose que vous avez un trigger qui exploite la colonne 'IDD' pour faire une insertion dans une autre table où justement cette colonne est à "NOT NULL".
    Lors de l'insertion, comme la valeur par défaut n'existe pas, la valeur retournée est NULL. Comme le trigger s'exécute avant de faire l'insertion, vous avez l'erreur 1048.

    Je pense que le fait de ne pas mettre "STRICT_TRANS_TABLES" dans la variable sql_mode, devrait résoudre votre problème.

    Et pour finir, comment l'introduire dans le fichier "my.ini" ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [wampmysqld]
    sql_mode = "ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    Pouvez-vous me dire si cela a résolu votre problème ?

    EDIT : j'ai testé avec le trigger pensant que mon astuce allait fonctionner. Et bien non, j'ai quand même l'erreur #1048.
    Après quelques recherches, je n'ai trouvé aucune solution pour résoudre votre problème.

    L'erreur #1048 apparaît quand on force la colonne à NULL.
    Inversement, si l'on ne précise pas le nom de la colonne dans le insert, on obtient l'erreur #1364 comme ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1364 (HY000) at line 70: Field 'val' doesn't have a default value
    Vis-à-vis de votre exemple, je ne comprends pas comment vous obtenez l'erreur #1048.
    Sauf si vous avez un trigger. Dans ce cas là, il suffit de corriger le trigger, en mettant ceci "ifnull(new.idd, 0)" à la place de "new.idd". Ainsi le NULL sera transformé par un zéro.

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

Discussions similaires

  1. Enregistrer tous les requetes sur une base
    Par darknesshappy dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2013, 11h21
  2. [MySQL] Requetes INNER JOIN afin d'alléger les requetes
    Par zeflex dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 06/07/2009, 14h02
  3. Accéler les requetes d 'insertions avec derby
    Par dondano dans le forum JDBC
    Réponses: 3
    Dernier message: 31/05/2007, 16h36
  4. une requete effectuant une recherche sur tous les champs
    Par raynor911 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/02/2006, 15h06
  5. Réponses: 11
    Dernier message: 06/09/2005, 13h27

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