J'ai une table avec une clé unique pour deux colonnes:
CREATE TABLE `xpo`.`user_permanent_gift` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`fb_user_id` INT UNSIGNED NOT NULL ,
`gift_id` INT UNSIGNED NOT NULL ,
`purchase_timestamp` TIMESTAMP NULL DEFAULT now() ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `user_gift_UNIQUE` (`fb_user_id` ASC, `gift_id` ASC) );
Je veux insérer une ligne dans cette table, mais si la clé existe, ne rien faire! Je ne veux pas qu'une erreur soit générée car les clés existent.
Je sais qu'il existe la syntaxe suivante:
INSERT ... ON DUPLICATE KEY UPDATE ...
mais y a-t-il quelque chose comme:
INSERT ... ON DUPLICATE KEY DO NOTHING
?
mysql
sql
unique-key
ufk
la source
la source
INSERT IGNORE
sans laON DUPLICATE KEY
pièce, par exempleINSERT IGNORE INTO xpo.user_permanent_gift (...) VALUES (...)
COMMENT METTRE EN ŒUVRE «insérer si non»?
1.
REPLACE INTO
avantages:
les inconvénients:
trop lent.
la clé d'incrémentation automatique CHANGE (augmente de 1) s'il y a des correspondances d'entrée
unique key
ouprimary key
, parce qu'elle supprime l'ancienne entrée, insère une nouvelle.2.
INSERT IGNORE
avantages:
les inconvénients:
la clé d'incrémentation automatique ne changera pas s'il y a des correspondances d'entrée
unique key
ou siprimary key
l'index d'incrémentation automatique augmentera de 1certaines autres erreurs / avertissements seront ignorés tels qu'une erreur de conversion de données.
3.
INSERT ... ON DUPLICATE KEY UPDATE
avantages:
les inconvénients:
semble relativement complexe si vous voulez simplement insérer et non mettre à jour.
la clé d'incrémentation automatique ne changera pas s'il y a des correspondances d'entrée
unique key
ou siprimary key
l'index d'incrémentation automatique augmentera de 14. Un moyen d'arrêter d'augmenter la clé d'incrémentation automatique s'il y a des correspondances d'entrée
unique key
ouprimary key
?Comme mentionné dans le commentaire ci-dessous par @toien: "la colonne d'auto-incrémentation sera effectuée dépend de la
innodb_autoinc_lock_mode
configuration après la version 5.1" si vous l'utilisezinnodb
comme moteur, mais cela affecte également la concurrence, il doit donc être bien pris en compte avant de l'utiliser. Jusqu'à présent, je ne vois pas de meilleure solution.la source
innodb_autoinc_lock_mode
config après la version 5.1Use
ON DUPLICATE KEY UPDATE ...
,Negative: parce que le
UPDATE
utilise des ressources pour la deuxième action.Utilisation
INSERT IGNORE ...
,négative: MySQL n'affichera aucune erreur si quelque chose ne va pas, vous ne pouvez donc pas gérer les erreurs. Utilisez-le uniquement si vous ne vous souciez pas de la requête.
la source