我已经阅读了this,this和this,但我无法使这个SQL工作:
INSERT INTO main_phrase (description) VALUES ('Mot commun féminin pluriel animaux');
/* ERROR: */
WITH
t1 AS (
SELECT id
FROM main_phrase
WHERE description='Mot commun féminin pluriel animaux'
),
t2 AS (
SELECT id
FROM main_groupecategories
WHERE description='Mot commun féminin pluriel animaux'
)
INSERT
INTO main_phrasegroupecategories (phrase_id, groupe_categories_id)
VALUES (t1.id, t2.id);
我明白了:
错误:表t1的FROM子句缺少条目
我错过了什么?
答案 0 :(得分:3)
main_phrase
中新插入的行与main_groupecategories
中的行description
相关联。 main_phrase.id
是serial
列。您不能在独立的VALUES
表达式中引用任何表格(包括CTE),您必须使用带有SELECT
子句的FROM
。但是有一个更好的解决方案。见下文。
使用data-modifying CTE代替整个操作更短,更安全,更快:
WITH p AS (
INSERT INTO main_phrase (description)
VALUES ('Mot commun féminin pluriel animaux') -- provide description once
RETURNING id, description -- and reuse it further down
)
INSERT INTO main_phrasegroupecategories (phrase_id, groupe_categories_id)
SELECT p.id, g.id
FROM p
JOIN main_groupecategories g USING (description);
如果要使用新行的任何值,请立即将它们与另一个RETURNING
子句一起返回到第二个INSERT
。
为什么你的(假定的)many-to-many relationship的两个表中都有冗余的description
?可能是数据库设计中的一个问题。
相关:
答案 1 :(得分:2)
试试这个:
INSERT INTO main_phrase (phrase_id, groupe_categories_id)
WITH
t1 AS (
SELECT id
FROM main_phrase
WHERE description='Mot commun féminin pluriel animaux'
),
t2 AS (
SELECT id
FROM main_groupecategories
WHERE description='Mot commun féminin pluriel animaux'
)
select t1.id, t2.id
from t1,t2;