MySQL Conditionnelle Insérer
Je vais avoir un moment difficile de former un conditionnel INSÉRER
J'ai x_table avec des colonnes (exemple, utilisateur, élément) où ID d'instance est unique. Je veux insérer une nouvelle ligne uniquement si l'utilisateur ne dispose pas d'un élément donné.
Par exemple en essayant d'insérer instance=919191 utilisateur=123 item=456
Insert into x_table (instance, user, item) values (919191, 123, 456)
ONLY IF there are no rows where user=123 and item=456
De l'aide ou des conseils dans la bonne direction serait très apprécié.
Vous devez vous connecter pour publier un commentaire.
Si votre SGBD n'impose pas de limitations sur la table dans laquelle vous sélectionnez lorsque vous exécutez une instruction insert, essayez:
Dans ce,
dual
est un tableau avec une ligne uniquement (qui se trouve à l'origine dans Oracle, maintenant dans mysql trop). La logique est que l'instruction SELECT génère une seule ligne de données avec les valeurs nécessaires, mais seulement lorsque les valeurs ne sont pas déjà trouvé.Sinon, regardez l'instruction MERGE.
dual
doivent être créés avant la main, dans ce cas, ou est-il une sorte de "temporaire" de la table créée par la requête pour l'utilisation de la requête seul?dual
déjà, vous devez le créer.CREATE TABLE dual ( dummy CHAR(1) DEFAULT 'x' NOT NULL CHECK (dummy = 'x') PRIMARY KEY ); INSERT INTO dual VALUES('x'); REVOKE ALL ON dual FROM PUBLIC; GRANT SELECT ON dual TO PUBLIC;
dual
déjà" déclaration a une fausse précédent (parce que MySQL a déjà ledual
) et reste une véritable déclaration d'ensemble (parce que dans la logique de SI la valeur est false ALORS conséquente true, indépendamment de la conséquence). Mais merci de noter que la DOUBLE existe bel et bien dans MySQL.SELECT COUNT(*) FROM dual
vous obtenez toujours1
, et si vousSELECT 'foo' FROM dual
vous obtenez toujoursfoo
. Mais vous ne pouvez pasSELECT * FROM dual
et vous ne pouvez pasDESCRIBE dual
ou quelque chose comme ça. Je n'ai pas vérifié, mais je ne pense pas que vous pouvez révoquer les autorisations surdual
, soit. Il est donc intéressant de noter qu'elle fonctionne comme prévu... sauf quand ça ne marche pas 😉Duplication error '1062'
) lorsque les doublons sont trouvés?SELECT * FROM x_table WHERE user = 123 AND item = 456
tandis que l'insert est en train de se passer?Vous pouvez également utiliser
INSERT IGNORE
qui ignore silencieusement l'insérer à la place de la mise à jour ou l'insertion d'une ligne lorsque vous avez un index unique sur (utilisateur, élément).La requête devrait ressembler à ceci:
Vous pouvez ajouter l'index unique avec
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.Avez-vous déjà essayé quelque chose comme ça?
Avec un
UNIQUE(user, item)
, n':la
user=123
bit est un "no-op" pour correspondre à la syntaxe de laON DUPLICATE
clause sans vraiment faire quoi que ce soit quand il y a des doublons.Dans le cas où vous ne souhaitez pas définir une contrainte unique, cela fonctionne comme un charme :
Espère que cela aide !
Si vous ajoutez une contrainte (x_table.l'utilisateur, x_table.l'élément) est unique, l'insertion d'une autre ligne avec le même utilisateur et le point va à l'échec.
par exemple:
Bien qu'il est bien de vérifier pour la duplication avant d'insérer vos données, je vous suggère de mettre une contrainte unique/indice sur vos colonnes, de sorte que pas de dupliquer les données peuvent être insérés par erreur.
Ce que vous voulez est
INSERT INTO table (...) SELECT ... WHERE ...
. de MySQL 5.6 manuel.Dans votre cas, c'est:
Ou peut-être puisque vous n'êtes pas à l'aide de toute logique compliquée pour determiante si la
INSERT
ou non vous pourriez tout simplement unUNIQUE
touche sur la combinaison de ces deux colonnes, puis utiliserINSERT IGNORE
.ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where...
(course 5.6.34)from dual
avantwhere
.La syntaxe peut varier en fonction de votre DB...
Légère modification à Alex, à la réponse, vous pourriez tout aussi bien référence à la colonne existante valeur:
Ce qui est synonyme de PostgreSQL
Vous pouvez utiliser la solution suivante pour résoudre votre problème: