2017-07-03 2 views
0

J'ai une question rapide sur le comportement de MySQL.MySQL remplacer dans le comportement avec une contrainte unique

Imaginez une table avec 3 (colonnes pertinentes):

id (PK + AI),somedate,someuser,etc... 

J'ai mis une contrainte unique (date, utilisateur). Alors, quand je commence par une table de test propre et exécuter deux fois la requête suivante:

REPLACE INTO `testtable` (somedate,someuser) VALUES('2017-01-01','admin'); 

Je me attendais une ligne avec la colonne « id » sur 1. mais chaque fois que je lance cette requête l'identifiant monte à cause de la incrément automatique et je ne peux pas avoir cela se produire (ce serait corrompre mes relations de données). Pourquoi est-ce? Puis-je faire en sorte que je puisse conserver la clé primaire d'origine lorsqu'un remplacement se produit?

+1

Afficher le schéma REAL pour cette table – RiggsFolly

+0

Pourquoi ne pas utiliser 'update'? –

+0

@PrabhatG Parce que je voulais que ce soit rapide et sale;) En toute gravité: je suis tombé sur le comportement et je voulais mieux le comprendre. – jwebdev

Répondre

1

Pas avec le REPLACE. C'est comme un INSERT précédé d'un DELETE. Le comportement que vous observez avec REPLACE est le même que le comportement que vous verriez si vous avez exécuté ces deux déclarations:

DELETE FROM `testtable` WHERE somedate = '2017-01-01' and someuser = 'admin'; 
INSERT INTO `testtable` (somedate,someuser) VALUES ('2017-01-01','admin'); 

Et cela signifie que la colonne auto_increment sur la ligne nouvellement insérée aura une nouvelle valeur.


Peut-être envisager d'utiliser INSERT ... ON DUPLICATE KEY UPDATE.

Référence: https://dev.mysql.com/doc/refman/5.7/en/insert-on-duplicate.html

(Notez que la tentative d'insérer une ligne qui est mise à jour utilisera une valeur auto_increment.)

0

Pour me semble que vous vouliez en fait une assez déclaration UPDATE comme

update `testtable` 
set somedate = '2017-01-01', 
    someuser = 'admin' 
where id = <id of the record> ;