11 votes

Insérer un enregistrement s'il n'existe pas en SQL, nom de colonne en double

J'ai voulu une solution pour insérer un enregistrement s'il n'est pas là donc j'ai cherché ici et trouvé une solution mais j'ai un autre problème

INSÉRER DANS closed_answers (question_id, subject_id)
SÉLECTIONNER * DE (SÉLECTIONNER 2, 2) COMME tmp
OÙ NON EXISTE (
    SÉLECTIONNER question_id DE closed_answers OÙ question_id = 2 ET subject_id = 2
) LIMITE 1

la sortie est

#1060 - Nom de colonne en double '2'

si j'utilise n'importe quels 2 nombres qui ne sont pas identiques cela fonctionnera mais le problème survient lorsque les 2 nombres sont les mêmes

19voto

Mark Byers Points 318575

La plus petite modification à apporter à votre SQL pour le rendre fonctionnel est d'ajouter des alias à votre instruction select :

INSERT INTO closed_answers (question_id, subject_id)
SELECT * FROM (SELECT 2 AS question_id, 2 AS subject_id) AS tmp
WHERE NOT EXISTS (
    SELECT question_id
    FROM closed_answers
    WHERE question_id = 2 AND subject_id = 2
) LIMIT 1

Cependant, si vous avez une contrainte unique sur (question_id, subject_id), vous pouvez utiliser INSERT IGNORE à la place :

INSERT IGNORE INTO closed_answers (question_id, subject_id)
VALUES (2, 2)

4voto

Fosco Points 20573
INSERT INTO closed_answers (question_id, subject_id) 
SELECT * FROM (SELECT 2 a, 2 b) AS tmp 
WHERE NOT EXISTS ( 
    SELECT 1 FROM closed_answers WHERE question_id = 2 AND subject_id = 2 
) LIMIT 1 

Votre déclaration de sélection avec la sous-requête est étrange et inutile, mais le problème était que vous n'avez pas nommé les colonnes sélectionnées. Lorsque vous utilisez exists, il suffit de sélectionner 1, plutôt qu'un champ. De plus, le limit 1 n'était pas nécessaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X