如何将数据插入父表和子表

时间:2019-05-15 11:04:41

标签: postgresql

我正在使用postgeSQL,但我有这样一个问题。

我有两张桌子,女巫看起来像这样:

父母:

CREATE TABLE public.parent
(
    parent_id bigint NOT NULL,
    name character varying(30) NOT NULL,
    email character varying(30) NOT NULL,
    child_id bigint NOT NULL,
    CONSTRAINT parent_pkey PRIMARY KEY (parent_id),
    CONSTRAINT unique_child UNIQUE (child_id)
,
    CONSTRAINT child_fkey FOREIGN KEY (child_id)
        REFERENCES public.child (child) MATCH SIMPLE
        ON UPDATE RESTRICT
        ON DELETE CASCADE
)

孩子:

CREATE TABLE public.child
(
    child bigint NOT NULL,
    money double precision NOT NULL,
    CONSTRAINT child_pkey PRIMARY KEY (child)
)

因此,我想在父表中同时在子表中插入数据。如何在一个查询中完成?有可能吗?

2 个答案:

答案 0 :(得分:2)

demo: db<>fiddle

使用CTE(WITH子句)可以进行两次插入:

WITH insert_child AS (
    INSERT INTO child VALUES
    (42, 5.23)
    RETURNING child
)
INSERT INTO parent
SELECT 
    /* parent data */
    child
FROM insert_child;

具有CTE的查询在“ main”查询之前独立执行CTE查询。 CTE的结果可以进一步使用。 CTE INSERT语句返回带有RETURNING子句的插入的子ID。以下查询将使用它。

Further reading, Documentation

答案 1 :(得分:1)

完成此要求的最简单方法是使用CTE,如下所示:

with tmp1 as (
 insert into child values(1001,27500.0) returning child
 )
insert into parent select 101,'Bob','Bob@gmail.com',tmp1.child from tmp1;
INSERT 0 1

select * from child;
 child | money 
-------+-------
  1001 | 27500

select * from parent;
 parent_id | name |     email     | child_id 
-----------+------+---------------+----------
       101 | Bob  | Bob@gmail.com |     1001

或者您可以编写触发器。