J'ai du mal à former un INSERT conditionnel
J'ai x_table avec des colonnes (instance, utilisateur, élément) où l'ID d'instance est unique. Je souhaite insérer une nouvelle ligne uniquement si l'utilisateur ne dispose déjà pas d'un élément donné.
Par exemple en essayant d'insérer instance = 919191 user = 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
Toute aide ou orientation dans la bonne direction serait très appréciée.
la source
dual
il être créé au préalable dans ce cas ou s'agit-il d'une sorte de table "temporaire" spéciale créée par la requête pour l'utilisation de la requête seule?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;
SELECT COUNT(*) FROM dual
obtenez toujours1
, et si vousSELECT 'foo' FROM dual
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 non plus que vous puissiez révoquer les autorisations surdual
. Il convient donc de souligner que cela fonctionne comme prévu ... sauf quand ce n'est pas le cas;)Vous pouvez aussi utiliser
INSERT IGNORE
qui ignore silencieusement l'insertion au lieu de mettre à jour ou d'insérer une ligne lorsque vous avez un index unique sur (utilisateur, élément).La requête ressemblera à ceci:
Vous pouvez ajouter l'index unique avec
CREATE UNIQUE INDEX user_item ON x_table (user, item)
.la source
Avez-vous déjà essayé quelque chose comme ça?
la source
Avec a
UNIQUE(user, item)
, faites:le
user=123
bit est un "no-op" pour correspondre à la syntaxe de laON DUPLICATE
clause sans rien faire quand il y a des doublons.la source
Au cas où vous ne voudriez pas définir une contrainte unique, cela fonctionne comme un charme:
J'espère que ça aide !
la source
Ce que tu veux, c'est
INSERT INTO table (...) SELECT ... WHERE ...
. à partir du manuel MySQL 5.6 .Dans votre cas c'est:
Ou peut-être que vous n'utilisez pas de logique compliquée pour déterminer s'il faut exécuter le
INSERT
ou non, vous pouvez simplement définir uneUNIQUE
clé sur la combinaison de ces deux colonnes, puis l'utiliserINSERT IGNORE
.la source
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...
(en cours d'exécution 5.6.34)from dual
avantwhere
.FROM DUAL
est la valeur par défaut si aucune table n'a été référencée ( voir cette documentation ).Si vous ajoutez une contrainte qui (x_table.user, x_table.item) est unique, l'insertion d'une autre ligne avec le même utilisateur et élément échouera.
par exemple:
la source
Bien qu'il soit bon de vérifier la duplication avant d'insérer vos données, je vous suggère de mettre une contrainte / un index unique sur vos colonnes afin qu'aucune donnée en double ne puisse être insérée par erreur.
la source
Vous pouvez utiliser la solution suivante pour résoudre votre problème:
la source
Légère modification de la réponse d'Alex, vous pouvez également simplement référencer la valeur de colonne existante:
la source
Donc celui-ci signifie PostgreSQL
la source
La syntaxe peut varier en fonction de votre base de données ...
la source