2010-11-22 9 views
1

Si je veux insérer un enregistrement tout en regardant une clé étrangère, je peux le faire avec:syntaxe SQL (INSERTS avec plusieurs clés étrangères)

INSERT INTO stores_products (name, product_id) 
SELECT 'storeABC', 
     id 
    FROM products 
WHERE name = 'product123'; 

(où product_id est une clé étrangère à la table des produits Cependant, je n'arrive pas à comprendre la syntaxe lorsque j'ai besoin de rechercher des clés étrangères à partir de plusieurs tables.

Par exemple, je veux faire quelque chose comme:

INSERT INTO stores_products 
    (name, product_id, owner_id) 
SELECT 'storeABC', products.id, owners.id 
FROM products 
WHERE name = 'product123' 
FROM owners 
WHERE name = 'owner456'; 

(La table et les noms de colonnes sont juste un exemple, je sais que cela ne fait pas tout à fait sens d'un point de vue de la conception de base de données, mais Ma question concerne la syntaxe ...). Merci.

Répondre

5

S'il n'y a aucune relation entre les produits et PROPRIÉTAIRES dossiers, utilisez:

INSERT INTO STORE_PRODUCTS 
    (name, product_id, owner_id) 
SELECT 'storeABC', 
     p.id, 
     (SELECT o.id 
      FROM OWNERS o 
     WHERE o.name = 'owner456') 
    FROM PRODUCTS p 
WHERE p.name = 'product123' 

Sinon, s'il y a une relation entre la table OWNERS et PRODUCTS - vous le spécifieriez avec un JOIN:

INSERT INTO STORE_PRODUCTS 
    (name, product_id, owner_id) 
SELECT 'storeABC', 
     p.id, 
     o.id   
    FROM PRODUCTS p 
    JOIN OWNERS o ON o.relation_to_product_col = p.relation_to_owner_col 
WHERE p.name = 'product123' 
    AND o.name = 'owner456' 

Référence:

0

Essayez de le faire comme:

mise à jour:

INSERT INTO stores_products 
    (name, product_id, owner_id) 
SELECT 'storeABC', 
     products.id, 
     owners.id 
    FROM products, owners 
    WHERE products.name = 'product123' 
AND WHERE owners.name = 'owner456'; 
+1

erreur MySQL 1064 - erreur de syntaxe à « ET OU nom ... » –

+0

a confirmé la « ET OÙ » syntaxe ne fonctionne pas avec MySQL – Fergal

1

Si [products.name] et [owners.name] sont uniques, vous pouvez faire une jointure cartésienne utilisant le mot clé jointure croisée. Le résultat sera une ligne contenant les identifiants que vous recherchez.

insert 
    into stores_products(name, product_id, owner_id) 
select 'storeABC' as name 
     ,products.id 
     ,owners.id 
from products cross join owners 
where products.name = 'product123' 
    and owners.name = 'owner456'; 
Questions connexes