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

Mef*_*ell 7 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
)
Run Code Online (Sandbox Code Playgroud)

孩子:

CREATE TABLE public.child
(
    child bigint NOT NULL,
    money double precision NOT NULL,
    CONSTRAINT child_pkey PRIMARY KEY (child)
)
Run Code Online (Sandbox Code Playgroud)

所以,我想在父表中插入数据,同时在子表中插入数据。如何在一个查询中完成它?是否可以?

S-M*_*Man 5

演示: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;
Run Code Online (Sandbox Code Playgroud)

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

进一步阅读,文档

  • 如果子表的 ID 有外键约束,如何才能实现此目的? (2认同)
  • @user2340939 根据正常约定,这些表的命名相反! (2认同)