Je veux ajouter une ligne à une table de base de données, mais si une ligne existe avec la même clé unique, je veux mettre à jour la ligne.
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 je l'utilise, insert IGNORE
il ignorera l'erreur, mais il ne sera toujours pas mis à jour.
mysql
sql
insert-update
upsert
Keshan
la source
la source
Réponses:
Utilisation
INSERT ... ON DUPLICATE KEY UPDATE
REQUETE:
la source
affected row count
traduit par2
une mise à jour réussie (sur une clé en double) d'une seule ligne? Quelqu'un d'autre a eu ce résultat? (Les données sont correctement mises à jour: ce qui signifie qu'une seule ligne est mise à jour)ON DUPLICATE KEY UPDATE
augmentent de 2 les lignes affectées. Il signale 0 si rien n'est réellement mis à jour (comme le normalUPDATE
).Découvrez REMPLACER
http://dev.mysql.com/doc/refman/5.0/en/replace.html
la source
Lorsque vous utilisez l'insertion par lots, utilisez la syntaxe suivante:
la source
VALUES(name)
cela ne fonctionne pas, vous pouvez essayername = 'name_value',...;
Essayez ceci:
J'espère que cela t'aides.
la source
Essaye ça:
INSERT INTO table (id,name,age) VALUES('1','Mohammad','21') ON DUPLICATE KEY UPDATE name='Mohammad',age='21'
Remarque:
ici, si id est la clé primaire, après la première insertion,
id='1'
chaque tentative d'insertionid='1'
mettra à jour le nom et l'âge et l'âge du nom précédent changera.la source
Toutes ces solutions fonctionneront concernant votre question.
Si vous voulez en savoir plus sur ces déclarations, visitez ce lien
la source
REPLACE
n'est pas documenté dans le document lié.Lors de l'utilisation de SQLite:
Pourvu que ce
id
soit la clé primaire. Ou bien il insère simplement une autre ligne. Voir INSERT (SQLite).la source
replace into
qui est exactement "insérer ou mettre à jour lorsqu'il existe". @OwlCREATE TRIGGER worklog_update AFTER INSERT ON worklog FOR EACH ROW REPLACE INTO support_time_monthly_hours ( ProjectID, monthTotalTime, Year, Month ) SELECT jiraissue.PROJECT, SUM(worklog.timeworked), YEAR(CURRENT_DATE()), MONTH(CURRENT_DATE()) FROM worklog, jiraissue WHERE worklog.issueid = jiraissue.ID AND jiraissue.PROJECT = (SELECT PROJECT FROM jiraissue WHERE NEW.issueid = jiraissue.ID ) AND worklog.startdate BETWEEN DATE_FORMAT(NOW() ,'%Y-%m-01 00:00:00') AND NOW();
Tout simplement parce que je cherchais ici cette solution mais pour la mise à jour à partir d'une autre table à structure identique (dans mon cas, testez la base de données du site Web en base de données en direct):
Comme mentionné ailleurs, seules les colonnes que vous souhaitez mettre à jour doivent être incluses après
ON DUPLICATE KEY UPDATE
.Pas besoin de lister les colonnes dans le
INSERT
ouSELECT
, même si je suis d'accord, c'est probablement une meilleure pratique.la source
Si vous souhaitez créer un
non-primary
champ comme critère / conditionON DUPLICATE
, vous pouvez créer uneUNIQUE INDEX
clé sur cette table pour déclencher leDUPLICATE
.Et si vous souhaitez combiner deux champs pour le rendre unique sur la table, vous pouvez y parvenir en ajoutant plus sur le dernier paramètre.
Remarque, assurez-vous simplement de supprimer d'abord toutes les données qui ont la même valeur
name
et laage
valeur sur les autres lignes.Après cela, il devrait déclencher l'
ON DUPLICATE
événement.la source
Dans mon cas, j'ai créé des requêtes ci-dessous mais dans la première requête si
id
1 existe déjà et l'âge est déjà là, après cela si vous créez la première requête sans,age
la valeur deage
sera nullepour éviter le problème ci-dessus, créez une requête comme ci-dessous
que cela vous aide ...
la source
Dans le cas, vous souhaitez conserver l'ancien champ (par exemple: nom). La requête sera:
la source