web-dev-qa-db-fra.com

Insérer dans une table MySQL ou mettre à jour s'il existe

Je souhaite ajouter une ligne à une table de base de données, mais si une ligne existe avec la même clé unique, je souhaite la mettre à jour.

Par exemple,

insert into table (id, name, age) values(1, "A", 19)

Disons que la clé unique est id, et dans ma base de données, il y a une ligne avec id = 1. Dans ce cas, je souhaite mettre à jour cette ligne avec ces valeurs. Normalement, cela donne une erreur. Si j'utilise insert IGNORE, l'erreur sera ignorée, mais elle ne sera toujours pas mise à jour.

737
Keshan

Utilisez INSERT ... ON DUPLICATE KEY UPDATE

QUERY:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name="A", age=19
1391
Donnie

Départ REMPLACER

http://dev.mysql.com/doc/refman/5.0/en/replace.html

REPLACE into table (id, name, age) values(1, "A", 19)
211
Martin Schapendonk

Lorsque vous utilisez l'insertion par lot, utilisez la syntaxe suivante:

INSERT INTO TABLE (id, name, age) VALUES (1, "A", 19), (2, "B", 17), (3, "C", 22)
ON DUPLICATE KEY UPDATE
    name = VALUES (name),
    ...
32
Fabiano Souza

Essayez ceci:

INSERT INTO table (id, name, age) VALUES (1, 'A', 19) ON DUPLICATE KEY UPDATE id = id + 1;

J'espère que cela t'aides.

24
Luis Reyes

Lorsque vous utilisez SQLite:

REPLACE into table (id, name, age) values(1, "A", 19)

Pourvu que id soit la clé primaire. Ou alors, il insère simplement une autre ligne. Voir INSERT (SQLite).

9
DawnSong
INSERT IGNORE INTO table (id, name, age) VALUES (1, "A", 19);

INSERT INTO TABLE (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE NAME = "A", AGE = 19;

REPLACE INTO table (id, name, age) VALUES(1, "A", 19);

Toutes ces solutions fonctionneront en ce qui concerne votre question.

Si vous voulez en savoir plus sur ces déclarations visitez ce lien

8
user2613580

Juste parce que je cherchais ici cette solution, mais pour la mise à jour à partir d'une autre table structurée de manière identique (dans mon cas, testez DB pour la base de données en direct):

INSERT  live-db.table1
SELECT  *
FROM    test-db.table1 t
ON DUPLICATE KEY UPDATE
        ColToUpdate1 = t.ColToUpdate1,
        ColToUpdate2 = t.ColToUpdate2,
        ...

Comme mentionné précédemment, seules les colonnes que vous souhaitez mettre à jour doivent être incluses après ON DUPLICATE KEY UPDATE.

Nul besoin de lister les colonnes dans INSERT ou SELECT, bien que je convienne que c'est probablement une meilleure pratique.

6
SteveCinq

Au cas où vous souhaiteriez conserver l’ancien champ (par exemple: nom). La requête sera:

INSERT INTO table (id, name, age) VALUES(1, "A", 19) ON DUPLICATE KEY UPDATE    
name=name, age=19;
0
Xman Classical

Dans mon cas, j'ai créé ci-dessous des requêtes mais dans la première requête si id 1 existe déjà et si l'âge est déjà là, après cela, si vous créez une première requête sans age, la valeur de age sera nulle 

REPLACE into table SET `id` = 1, `name` = 'A', `age` = 19

pour éviter le problème ci-dessus créer une requête comme ci-dessous

INSERT INTO table SET `id` = '1', `name` = 'A', `age` = 19 ON DUPLICATE KEY UPDATE `id` = "1", `name` = "A",`age` = 19

que cela vous aide ...

0
Renish Gotecha