2010-07-22 7 views
0

Je souhaite insérer une ligne dans la table A, mais uniquement si une autre ligne de la table B existe. Par exemple quelque chose comme ça ...Insérer conditionnellement une ligne

IF EXISTS (SELECT * FROM B WHERE id=1) 
    INSERT INTO A 
     (id, value1, value2) 
     VALUES (1, 'foo', 'bar') 

Cependant, cela ne fonctionne pas. Ce qui sera?

+0

Awww. N'est-ce pas (en vérifiant les conditions avant d'insérer une ligne) qu'un travail est réellement nécessaire pour la couche applicative? Comment réagiriez-vous si la rangée n'existait pas? –

+0

Si la ligne n'existe pas, rien ne doit arriver. Dans ce cas, ne faire qu'une seule requête comme celle-ci sera plus efficace. Pour répondre à votre autre question, je ne pense pas que placer la vérification dans la couche d'application serait mieux dans le style, car elle serait juste à côté de la requête de toute façon. – Cam

+0

Je pense que le point de Pekka est que l'application n'est pas consciente de l'état de la requête. Si la condition est fausse, la requête réussit. Généralement, vous souhaitez que votre application * sache * si les données ont été enregistrées ou non. Sinon, vous ne devriez pas le stocker en premier lieu. – cbednarski

Répondre

3
INSERT INTO A (value1, value2, value3) 
    SELECT 'foo', 'bar', 'foo' FROM B WHERE ID = 1 

Un problème potentiel est ici si votre condition est remplie plus d'une fois, il va insérer autant de lignes réglées de manière à votre requête, mais il fera ce que vous voulez, n'insérer si les conditions de la sélection sont rencontré.

+0

+1: Tu me bats, et j'aime mieux le tien. –

+0

Pouvez-vous expliquer plus en détail comment cela fonctionne? Peut-être que je ne comprends pas assez bien, mais comment peut-il faire cela? – Cam

+1

@incrediman: Les valeurs du SELECT sont statiquement définies - ce ne sont pas des valeurs qui existent dans TABLE_B –

0

Jetez un oeil à this morceau de manuel MySQL, il donne un exemple avec SELECT, mais peut-être INSERT fonctionnerait également d'une manière similaire?

Questions connexes