我正在使用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)
)
因此,我想在父表中同时在子表中插入数据。如何在一个查询中完成?有可能吗?
答案 0 :(得分:2)
使用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。以下查询将使用它。
答案 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
或者您可以编写触发器。