2017-10-19 2 views
0

j'ai 3 tables professionals, services et feature_professional je dois insérer des données dans lors de l'insertion d'un professional. C'est le sql que j'ai essayé.PostgreSQL 2 relations Insertion à la fois

WITH professionals as (INSERT INTO professionals(id, company_id, first_name) 
VALUES (1, 1, 'peter') RETURNING *) 

INSERT INTO services(id, professional_id, name) 
VALUES (1, (select professionals.id from professionals), 'haircut'), 

INSERT INTO feature_professional(id, professional_id, feature_id, enabled) 
VALUES 
    (1, (select professionals.id from professionals), 1, true) 

J'ai aussi essayé différentes variations de ce emballage toutes les instructions d'insertion à l'intérieur entre parenthèses, mais toujours pas de chance. L'erreur que j'obtiens est un syntax error.

ERROR: syntax error at or near "INSERT" 
LINE 106: INSERT INTO feature_professional 

Quelle est la syntaxe correcte pour accomplir ceci? Je sais que si je sors la troisième déclaration insert la requête fonctionne. Par exemple:

WITH professionals as (INSERT INTO professionals(id, company_id, first_name) 
VALUES (1, 1, 'peter') RETURNING *) 

INSERT INTO services(id, professional_id, name) 
VALUES (1, (select professionals.id from professionals), 'haircut') 

Répondre

0

Vous ne pouvez pas faire deux insert après une cte, donc envelopper chacun dans un autre cte

SQL DEMO

WITH professionals as (
    INSERT INTO professionals(id, company_id, first_name) 
    VALUES (1, 1, 'peter') RETURNING * 
), 
services as (
    INSERT INTO services(id, professional_id, name) 
    VALUES (1, (select professionals.id from professionals), 'haircut') 
) 
INSERT INTO features(id, professional_id, name) 
VALUES (1, (select professionals.id from professionals), 'autobook'); 

select * from professionals; 
select * from services; 
select * from features; 
+0

Si je fais 2 déclarations de cte avec un insert à l'intérieur d'eux ne va pas créer 2 enregistrements dans la DB? – Rodrigo

+0

Je n'ai jamais inséré dans un cte auparavant, donc j'essaye de le faire [** DEMO **] (http://sqlfiddle.com/#!17/23e05/2) mais après l'insertion, la table ne montre aucune ligne insérée. Est-ce que cela devrait fonctionner? –

+0

Cela fonctionne et c'est essentiellement ce que j'ai dans mon application en ce moment. [DEMO] (http://sqlfiddle.com/#!17/23e05/9). – Rodrigo

0
INSERT INTO feature_professional (id, professional_id, feature_id, enabled) 
select ?, professionals.id from professionals, ?, ? 

A condition que les points d'interrogation sont des valeurs que vous pouvez insérer. Si elles ne sont pas nécessaires, vous pouvez simplement les omettre.

INSERT INTO feature_professional (professional_id) 
select professionals.id from professionals 

Voici comment insérer à partir d'une sélection au lieu des valeurs statiques:

https://www.w3schools.com/sql/sql_insert_into_select.asp

+0

Je ne sais pas si cela a du sens, mais le problème que j'ai est d'exécuter ces 3 requêtes dans une requête. Je suis confiant que les instructions d'insertion réelles sont correctes, juste comment j'utilise 3 d'entre eux dans une requête est incorrecte – Rodrigo