Postgresql PGSQL插入到要插入到B的get ID中

Postgresql PGSQL插入到要插入到B的get ID中,postgresql,triggers,insert,sequence,Postgresql,Triggers,Insert,Sequence,表A是我所有表的唯一序列 -- Table: public."IdCentral" -- DROP TABLE public."IdCentral"; CREATE TABLE public."IdCentral" ( "Id" bigint NOT NULL DEFAULT nextval('"IdCentral_Id_seq"'::regclass), "Tag" character varying(127) COLLATE pg_catalog."default",

表A是我所有表的唯一序列

-- Table: public."IdCentral"

-- DROP TABLE public."IdCentral";

CREATE TABLE public."IdCentral"
(
    "Id" bigint NOT NULL DEFAULT nextval('"IdCentral_Id_seq"'::regclass),
    "Tag" character varying(127) COLLATE pg_catalog."default",
    CONSTRAINT "IdCentral_pkey" PRIMARY KEY ("Id")
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;
表B是我数据库中的任何表

-- Table: public."Users"

-- DROP TABLE public."Users";

CREATE TABLE public."Users"
(
    "Id" bigint NOT NULL,
    "Login" character varying(30) COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT "Users_pkey" PRIMARY KEY ("Id"),
    CONSTRAINT "PK" FOREIGN KEY ("Id")
        REFERENCES public."IdCentral" ("Id") MATCH FULL
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)
WITH (
    OIDS = FALSE
)
TABLESPACE pg_default;

ALTER TABLE public."Users"
    OWNER to dba;
当我想插入到B中时,我需要在a中创建一条新记录,并将B表名作为标记传递。

您需要的是:

。。。这将在插入后为您提供ID序列的当前值。为了安全起见,最好在事务中使用它,尤其是将它与负载平衡结合使用时:

BEGIN;
INSERT INTO "a" ...
INSERT INTO "b" VALUES ( CURRVAL('IdCentral_Id_seq', ... )
COMMIT;
也就是说,您似乎正在为数据库实现一个“通用ID”系统。这是每个新DBA都尝试过的(我尝试过),而且这不可避免地是一个坏主意,你最终会花很多时间来重构。如果你真的需要某种通用的ID,考虑使用UUID代替。
BEGIN;
INSERT INTO "a" ...
INSERT INTO "b" VALUES ( CURRVAL('IdCentral_Id_seq', ... )
COMMIT;