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 :

Insert into if not exists


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut Insert into if not exists
    Bonjour a tous,
    j'ai une question, je ne trouve pas la bonne syntaxe sql, j'ai des requetes insert into , je veux lui dire 'insert into if not exists'.
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `base`.`activity` (id_activity,activity) values (1,'Photographie')
    on duplicate key update id_activity = last_insert_id();
    le on duplicate update fais en sorte d’insérer s'il y'a déja des données dans la table, maintenant pour le insert into if not exists je sais pas trop comment faire.
    j'ai essayé ceci mais la syntaxe n'est pas bonne.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `base`.`activity` (id_activity,activity) values (1,'Photographie') where not exists (select *
    						from activity where id_activity = 1)
    Si vous avez des solutions merci de partager

  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
    Bonjour,

    La syntaxe en ce cas est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into ma_table1(col1, col2, ..., coln) 
           select cola, colb, ..., colz
           from ma_table2
           where not exists (...)
    sinon il auxiste aussi la fonction replace : http://dev.mysql.com/doc/refman/5.7/en/replace.html

  3. #3
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Bonjour,
    J'ai aussi essayé cette syntaxe la même chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO `base`.`activity` (id_activity,activity) values (1,'Photographie')
    select * from activity wherenot exists (id_activity= 1)
    il n'accepte pas le select après ni avant le insert.

  4. #4
    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
    Normal, vous n'avez pas respecté la syntaxe, cf. mon post précédent

  5. #5
    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 Coeur de Pirat.

    Il y a plusieurs problèmes dans la façon de gérer ton insertion.

    1) je te l'ai déjà dit mais tu continues de gérer l'identifiant alors que MySql sait mieux le faire que toi.
    Donc pourquoi continues-tu de gérer par toi-même les identifiants du type 'auto_increment' ?

    2) d'après ce que je comprends, tu veux insérer une nouvelle ligne à partie de la "value" de l'insert.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT IGNORE INTO `activity` (activity) values ('Photographie');
    Si tu veux utiliser cette syntaxe et insérer d'une manière unique l'activité alors tu dois utiliser un 'unique index' sur la colonne 'activity'.
    Tu auras remarqué que j'ai utilisé le mot clef 'ignore' afin de ne pas avoir un message d'anomalie en cas de duplication.

    3) si tu ne veux pas créer un 'unique index' alors le 'insert into ... values' ne peut pas être utilisé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into `activity` (`activity`)
        select * from (  select 'photographe' as activity from dual  ) as temp
        where not exists (select activity from activity where activity = temp.activity);
    Dans cet autre cas de l'insertion, je passe par l'intermediaire d'une sous-requête.
    Comme tu le constates, je teste son existence avant de l'insérer dans la table 'activity' et je ne gère toujours pas l'identifiant.

    4) prenez le temps de lire la documentation MySql avant de poser la question !

    Voici les exemples :
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    --------------
    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 `activity`
    --------------
     
    --------------
    CREATE TABLE `activity`
    (
      `id_activity`  integer unsigned NOT NULL auto_increment primary key,
      `activity`     varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `activity` (`activity`) values
      ('boulanger'),('photographe'),('peintre'),('charcutier')
    --------------
     
    --------------
    select * from activity order by id_activity
    --------------
     
    +-------------+-------------+
    | id_activity | activity    |
    +-------------+-------------+
    |           1 | boulanger   |
    |           2 | photographe |
    |           3 | peintre     |
    |           4 | charcutier  |
    +-------------+-------------+
    --------------
    commit
    --------------
     
    --------------
    insert into `activity` (`activity`) value ('photographe')
    --------------
     
    --------------
    insert into `activity` (`activity`) value ('artisan')
    --------------
     
    --------------
    select * from activity order by id_activity
    --------------
     
    +-------------+-------------+
    | id_activity | activity    |
    +-------------+-------------+
    |           1 | boulanger   |
    |           2 | photographe |
    |           3 | peintre     |
    |           4 | charcutier  |
    |           5 | photographe |
    |           6 | artisan     |
    +-------------+-------------+
    --------------
    rollback
    --------------
     
    --------------
    create unique index `idx` USING BTREE on `activity` (`activity`)
    --------------
     
    --------------
    insert ignore into `activity` (`activity`) value ('photographe')
    --------------
     
    --------------
    insert ignore into `activity` (`activity`) value ('artisan')
    --------------
     
    --------------
    select * from activity order by id_activity
    --------------
     
    +-------------+-------------+
    | id_activity | activity    |
    +-------------+-------------+
    |           1 | boulanger   |
    |           2 | photographe |
    |           3 | peintre     |
    |           4 | charcutier  |
    |           8 | artisan     |
    +-------------+-------------+
    --------------
    rollback
    --------------
     
    --------------
    drop index `idx` on `activity`
    --------------
     
    --------------
    describe activity
    --------------
     
    +-------------+------------------+------+-----+---------+----------------+
    | Field       | Type             | Null | Key | Default | Extra          |
    +-------------+------------------+------+-----+---------+----------------+
    | id_activity | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | activity    | varchar(255)     | NO   |     | NULL    |                |
    +-------------+------------------+------+-----+---------+----------------+
    --------------
    insert into `activity` (`activity`)
        select * from (  select 'photographe' as activity from dual  ) as temp
        where not exists (select activity from activity where activity = temp.activity)
    --------------
     
    --------------
    insert into `activity` (`activity`)
        select * from (  select 'artisan' as activity from dual  ) as temp
        where not exists (select activity from activity where activity = temp.activity)
    --------------
     
    --------------
    select * from activity order by id_activity
    --------------
     
    +-------------+-------------+
    | id_activity | activity    |
    +-------------+-------------+
    |           1 | boulanger   |
    |           2 | photographe |
    |           3 | peintre     |
    |           4 | charcutier  |
    |           9 | artisan     |
    +-------------+-------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Bonjour Artemus 24,
    Merci pour ta réponse
    Dans ma base de données, j'ai deux tables activity et constructeur dont l'id n'est pas en auto incrément, d'ailleurs je vais le signaler car a mon avis ceci pose probleme.

    ma question c'était de faire des insertions mais au cas ou cette valeur existe déjà dans la table , ne pas faire des insertions.

    J'ai essayé ton code comme ceci mais ça marche pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into `constructeur` (name)
      select *
    from (  select 'OLYMPUS' as name from constructeur  ) as temp
    where not exists (select name from constructeur where name = temp.constructeur)
    cela me donne une erreur de synrtaxe : Error Code: 1054. Unknown column 'temp.manufacturer' in 'where clause'.

    Et si j'utilise ceci , la valeur est inséré avec un id= 0 même si elle existe déjà :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert ignore into `constructeur` (name) values ('OLYMPUS')
    Merci pour ton aide

  7. #7
    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 Coeur de Pirat.

    Ca fonctionne à la condition de reproduire exactement l'exemple que je t'ai donné !
    En rouge, ce que tu n'as pas fait correctement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    insert into `constructeur` (name)
      select name
      from (  select 'OLYMPUS' as name from constructeur  ) as temp
      where not exists (select name from constructeur where name = temp.name)
    Sauf que dans mon exemple, j'ai dédié la gestion de l'auto_increment à MySql.
    Et j'ai utilisé un "unique index" sur la colonne "name".

    Citation Envoyé par Coeur de Pirat
    ma question c'était de faire des insertions mais au cas où cette valeur existe déjà dans la table , ne pas faire des insertions.
    J'ai bien compris ta demande !

    Citation Envoyé par Coeur de Pirat
    Et si j'utilise ceci , la valeur est inséré avec un id= 0 même si elle existe déjà :
    C'est nomal d'avoir zéro.

    D'une part, tu n'utilises pas l'auto_increment et de ce fait MySql ne peut pas gérer cette colonne automatiquement.
    Donc, c'est à toi de gérer la valeur de cet incrément.

    D'autre part, si tu utilises "last_insert_id()", cela ne fonctionnera pas car cette fonction utilise auto_increment de MySql.

    La solution est de rechercher la valeur maximale et d'ajouter +1.
    Sur un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    set @rang = (select coalesce(max(id_activity)+1,1) from activity);
    insert into `activity` (`id_activity`,`activity`) value (@rang, 'photographe');
    Il n'est pas possible de faire un select sur la table qui est utilisé pour l'insert.

    Sur l'exemple que je t'ai donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    insert into `activity` (`id_activity`,`activity`)
        select * from (  select (select coalesce(max(id_activity)+1,1) from activity) as id_activity, 'photographe' as activity from dual  ) as temp
        where not exists (select activity from activity where activity = temp.activity);
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  8. #8
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Bonjour Artemus,
    Merci pour ta réponse, effectivement j'avais mis
    select * au lieu de name
    J'ai testé avec une seule valeur ça marche, mais dés qu'il y'a plusieurs valeurs insérées, le probléme perciste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    INSERT INTO base.manufacturer(name,adresse)
     
    SELECT DISTINCT
    (select name
    from
    (select 'OLYMPUS' as name  from manufacturer) as temp1
    where not exists ( select name from manufacturer where name = temp1.name)),
    (select adresse
    from
    (select 'Parc d\'affaires SILIC 74,rue d\'Arcueil' adresse from manufacturer) as temp2
    where not exists ( select adresse from manufacturer where adresse = temp2.adresse))
     
     on duplicate key update id_manufacturer = last_insert_id();
    la valeur est insérée une fois mais quand je ré-exécute , l'id s'incrémente et donc j'ai une ligne d'ajouter avec un id AI.
    j'ai testé sans le on duplicate key update mais ça me donne le même résultat, (le on duplicate key update, je l'ai ajouter au cas ou il existe déjà des valeurs dans la base).
    Merci pour ton retour

  9. #9
    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 Coeur de Pirat.

    Je me demande si tu lis les messages en entier !
    Je vais recommencer mes explications car tu n'as rien compris.

    1) tu as deux solutions pour gérer ton "id" :

    --> soit tu laisses MySql se débrouiller tout seul, et donc tu déclares ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `id_activity` integer unsigned NOT NULL auto_increment primary key,
    mais ensuite, tu ne fais plus aucune référence à ce 'id_activity' dans tes insert et autres select.

    --> soit tu le gères pas toi-même.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `id_activity` integer unsigned NOT NULL primary key,
    mais dans ce cas là, tu dois récupérer la dernière valeur insérée (la maximale) dans la table, puis faire +1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select coalesce(max(id_activity)+1,1) from activity) as id_activity, ...
    Que fait ce select ?
    Il recherche la plus grande valeur de ta colonne 'id_activity'. Deux cas :
    --> soit il l'a trouve et tu fais un '+1' dessus.
    --> Soit il ne l'a trouve pas et le select te retourne un NULL, que tu vas remplacer par un '1'.

    2) pour éviter les doublons, tu as aussi deux solutions.
    2-a) soit tu crées un 'unique index' sur la ou les colonnes. C'est la solution la plus simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    create unique index `idx1` USING BTREE on `manufacturer` (`name`);
    create unique index `idx2` USING BTREE on `manufacturer` (`adresse`);
    Dans cette solution, tu peux insérer normalement ta ligne, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    insert ignore into `manufacturer` (`name`,`adresse`) values ('OLYMPUS', 'Parc d\'affaires SILIC 74,rue d\'Arcueil');
    Tu remarques le "IGNORE" afin de ne pas avoir de message d'anomalie en cas de doublon.
    Mais la ligne sera insérée si les valeurs des deux colonnes 'name' et 'adresse' ne sont pas déjà présentes dans la table.

    2-b) soit de faire un 'where not exists' sur la colonne que tu désires tester.
    Comme dans ton nouvel exemple, tu veux tester la colonne 'name' et la colonne 'adresse', voici comment procéder :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    3) Voici la solution lorsque tu dois gérer par toi-même le 'id' :
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    --------------
    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 `manufacturer`
    --------------
     
    --------------
    CREATE TABLE `manufacturer`
    (
      `id_manufacturer`  integer unsigned NOT NULL primary key,
      `name`             varchar(255)     NOT NULL,
      `adresse`          varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `manufacturer` (`id_manufacturer`, `name`, `adresse`)
     
    select * from (
        select (select coalesce(max(id_manufacturer)+1,1) from manufacturer) as id_manufacturer,
               'OLYMPUS'                                                     as name,
               'Parc d\'affaires SILIC 74,rue d\'Arcueil'                    as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT INTO `manufacturer` (`id_manufacturer`, `name`, `adresse`)
     
    select * from (
        select (select coalesce(max(id_manufacturer)+1,1) from manufacturer) as id_manufacturer,
               'NIKON'                                                       as name,
               'Parc d\'affaires SILIC 74,rue d\'Arcueil'                    as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT INTO `manufacturer` (`id_manufacturer`, `name`, `adresse`)
     
    select * from (
        select (select coalesce(max(id_manufacturer)+1,1) from manufacturer) as id_manufacturer,
               'CANON'                                                       as name,
               '17 Quai du Président Paul Doumer'                            as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    |               2 | CANON   | 17 Quai du Président Paul Doumer       |
    +-----------------+---------+----------------------------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    4) La solution si c'est MySql qui gère le 'id' :
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
     
    --------------
    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 `manufacturer`
    --------------
     
    --------------
    CREATE TABLE `manufacturer`
    (
      `id_manufacturer`  integer unsigned NOT NULL auto_increment primary key,
      `name`             varchar(255)     NOT NULL,
      `adresse`          varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    INSERT INTO `manufacturer` (`name`, `adresse`)
     
    select * from (
        select 'OLYMPUS'                                  as name,
               'Parc d\'affaires SILIC 74,rue d\'Arcueil' as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT INTO `manufacturer` (`name`, `adresse`)
     
    select * from (
        select 'NIKON'                                    as name,
               'Parc d\'affaires SILIC 74,rue d\'Arcueil' as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT INTO `manufacturer` (`name`, `adresse`)
     
    select * from (
        select 'CANON'                            as name,
               '17 Quai du Président Paul Doumer' as adresse
        from dual
    ) as temp
    where not exists (select    name from manufacturer where    name = temp.name)
    and   not exists (select adresse from manufacturer where adresse = temp.adresse)
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    |               2 | CANON   | 17 Quai du Président Paul Doumer       |
    +-----------------+---------+----------------------------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    5) et enfin, la solution avec le 'unique index' :
    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
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    --------------
    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 `manufacturer`
    --------------
     
    --------------
    CREATE TABLE `manufacturer`
    (
      `id_manufacturer`  integer unsigned NOT NULL auto_increment primary key,
      `name`             varchar(255)     NOT NULL,
      `adresse`          varchar(255)     NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    create unique index `idx1` USING BTREE on `manufacturer` (`name`)
    --------------
     
    --------------
    create unique index `idx2` USING BTREE on `manufacturer` (`adresse`)
    --------------
     
    --------------
    describe `manufacturer`
    --------------
     
    +-----------------+------------------+------+-----+---------+----------------+
    | Field           | Type             | Null | Key | Default | Extra          |
    +-----------------+------------------+------+-----+---------+----------------+
    | id_manufacturer | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
    | name            | varchar(255)     | NO   | UNI | NULL    |                |
    | adresse         | varchar(255)     | NO   | UNI | NULL    |                |
    +-----------------+------------------+------+-----+---------+----------------+
    --------------
    INSERT IGNORE INTO `manufacturer` (`name`, `adresse`) values
      ('OLYMPUS', 'Parc d\'affaires SILIC 74,rue d\'Arcueil')
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT IGNORE INTO `manufacturer` (`name`, `adresse`)  values
      ('NIKON', 'Parc d\'affaires SILIC 74,rue d\'Arcueil')
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    +-----------------+---------+----------------------------------------+
    --------------
    INSERT IGNORE INTO `manufacturer` (`name`, `adresse`) values
      ('CANON', '17 Quai du Président Paul Doumer')
    --------------
     
    --------------
    select * from manufacturer
    --------------
     
    +-----------------+---------+----------------------------------------+
    | id_manufacturer | name    | adresse                                |
    +-----------------+---------+----------------------------------------+
    |               1 | OLYMPUS | Parc d'affaires SILIC 74,rue d'Arcueil |
    |               3 | CANON   | 17 Quai du Président Paul Doumer       |
    +-----------------+---------+----------------------------------------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    Cette solution est quand même bien plus simple que les deux autres ci-dessus !

    J'espère que maintenant tu as enfin compris comment faire !

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

  10. #10
    Membre habitué Avatar de Coeur de Pirat
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 82
    Points : 150
    Points
    150
    Par défaut
    Artemus 24,

    merci beaucoup pour ces précisions, oui je suis dans le cas ou Mysql gère les id :

    Le script marche très bien

    Merci pour ton aide

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

Discussions similaires

  1. not exists sur Insert into
    Par Nikimizi dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/06/2013, 11h03
  2. Insert into table if not exists
    Par cisco.nat dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/06/2013, 13h07
  3. Réponses: 3
    Dernier message: 14/03/2012, 14h09
  4. Requete INSERT INTO avec IF NOT EXISTS: Est-ce possible ?
    Par yann123456 dans le forum Requêtes
    Réponses: 14
    Dernier message: 15/06/2009, 15h37
  5. Insert .. where not exists
    Par Zolex dans le forum SQL Procédural
    Réponses: 11
    Dernier message: 02/03/2007, 11h26

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