PGSQL插入A获取ID插入B

时间:2017-07-17 13:59:42

标签: 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",
    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表名称作为标记传递。

1 个答案:

答案 0 :(得分:1)

你想要的是CURRVAL

SELECT CURRVAL('IdCentral_Id_seq');

...它将在插入后为您提供ID序列的当前值。为了安全起见,最好在事务中使用它,特别是如果你将它与负载平衡相结合:

BEGIN;
INSERT INTO "a" ...
INSERT INTO "b" VALUES ( CURRVAL('IdCentral_Id_seq', ... )
COMMIT;

话虽如此,您似乎正在为您的数据库实施“通用ID”系统。这是每个新DBA尝试(我做过)的事情,并且你最终花费大量时间重构后不可避免地是一个坏主意。如果您真的需要某种通用ID,请考虑使用UUID。